数据库初识与安装

一、数据库概述

1.1 什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。简单来说,数据库就是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合

1.2 数据库的发展历程

年代 发展阶段 特点
20世纪60年代 文件系统 数据冗余大,独立性差
20世纪70年代 层次/网状数据库 数据结构化,但操作复杂
20世纪80年代 关系型数据库 理论基础完善,使用SQL,成为主流
21世纪初 NoSQL数据库 非关系型,高扩展性,大数据场景
2010年代 NewSQL数据库 兼顾ACID和NoSQL的可扩展性

1.3 数据库的分类

关系型数据库(SQL)

以表格形式存储数据,表之间通过主外键建立关系,使用SQL查询。

数据库 特点 适用场景
MySQL 开源、轻量、社区活跃 Web应用、中小型项目
PostgreSQL 功能丰富、标准兼容性好 复杂业务、地理信息
Oracle 商业数据库、功能强大 大型企业、金融行业
SQL Server 微软产品、与Windows集成好 .NET生态、企业应用
SQLite 嵌入式、零配置 移动应用、小型工具
非关系型数据库(NoSQL)
类型 代表产品 特点 适用场景
键值存储 Redis, Memcached 高性能、简单 缓存、会话存储
文档型 MongoDB, CouchDB 类JSON格式、Schema-less 内容管理、日志
列族型 HBase, Cassandra 海量数据、高扩展 大数据分析
图数据库 Neo4j, JanusGraph 关系处理高效 社交网络、推荐系统

1.4 核心概念

术语 说明
数据(Data) 描述事物的符号记录,如"张三"、"25"
表(Table) 数据的二维结构,由行和列组成
记录/行(Record/Row) 表中的一个完整数据条目
字段/列(Field/Column) 数据的一个属性,如姓名、年龄
主键(Primary Key) 唯一标识一条记录的字段
外键(Foreign Key) 关联其他表的字段
索引(Index) 提高查询速度的数据结构
视图(View) 基于表的虚拟表
存储过程(Stored Procedure) 预编译的SQL语句集合

1.5 SQL语言分类

分类 全称 作用 常用命令
DDL Data Definition Language 定义数据库结构 CREATE, ALTER, DROP
DML Data Manipulation Language 操作数据 INSERT, UPDATE, DELETE
DQL Data Query Language 查询数据 SELECT
DCL Data Control Language 权限控制 GRANT, REVOKE
TCL Transaction Control Language 事务管理 BEGIN, COMMIT, ROLLBACK

二、MySQL数据库安装

2.1 MySQL版本选择

版本 特点 适用场景
MySQL 8.0 最新稳定版,性能提升,功能丰富 新项目推荐
MySQL 5.7 经典版本,兼容性好 现有项目维护
MariaDB 10.x MySQL分支,完全兼容 开源社区首选
Percona Server 优化版,性能更好 高并发场景

2.2 Linux系统安装MySQL

Ubuntu/Debian系统

bash

复制代码
# 1. 更新软件包索引
sudo apt update

# 2. 安装MySQL
sudo apt install -y mysql-server

# 3. 查看MySQL版本
mysql --version

# 4. 启动MySQL并设置开机自启
sudo systemctl enable --now mysql

# 5. 查看状态
sudo systemctl status mysql

# 6. 查看监听端口
sudo netstat -tlnp | grep 3306
CentOS/RHEL系统

bash

复制代码
# 1. 添加MySQL官方仓库
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 2. 安装MySQL
sudo yum install -y mysql-community-server

# 3. 启动MySQL
sudo systemctl enable --now mysqld

# 4. 查看初始密码
sudo grep 'temporary password' /var/log/mysqld.log

# 5. 执行安全配置脚本
sudo mysql_secure_installation

2.3 安全配置

bash

复制代码
# 运行安全配置脚本
sudo mysql_secure_installation

# 配置选项说明
# 1. 设置root密码(复杂度要求:大小写字母+数字+特殊字符)
# 2. 移除匿名用户(Remove anonymous users? Y)
# 3. 禁止root远程登录(Disallow root login remotely? Y)
# 4. 删除测试数据库(Remove test database and access to it? Y)
# 5. 重载权限表(Reload privilege tables now? Y)

2.4 验证安装

bash

复制代码
# 1. 使用root登录
sudo mysql -u root -p

# 2. 查看数据库
SHOW DATABASES;

# 3. 查看版本
SELECT VERSION();

# 4. 查看当前用户
SELECT USER(), CURRENT_USER();

# 5. 退出
EXIT;

三、MySQL基础配置

3.1 配置文件位置

bash

复制代码
# 主配置文件
/etc/mysql/my.cnf
/etc/mysql/mysql.conf.d/mysqld.cnf  # Ubuntu
/etc/my.cnf                          # CentOS

# 查看当前配置
sudo mysql --help | grep -A 1 "Default options"

3.2 基础配置示例

ini

复制代码
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 基础设置
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 连接设置
max_connections = 500
max_connect_errors = 10000
wait_timeout = 28800
interactive_timeout = 28800

# 日志设置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

# InnoDB设置
default-storage-engine = InnoDB
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# 安全设置
local_infile = 0
skip_symbolic_links = yes
secure_file_priv = /var/lib/mysql-files

3.3 重启服务应用配置

bash

复制代码
# 测试配置
sudo mysqld --validate-config

# 重启MySQL
sudo systemctl restart mysql

# 查看错误日志
sudo tail -f /var/log/mysql/error.log

四、MySQL基本操作

4.1 连接与断开

bash

复制代码
# 本地连接
mysql -u root -p

# 远程连接
mysql -h 192.168.1.100 -P 3306 -u root -p

# 连接后执行SQL并退出
mysql -u root -p -e "SHOW DATABASES;"

# 断开连接
EXIT;
QUIT;
\q

4.2 数据库操作

sql

复制代码
-- 查看所有数据库
SHOW DATABASES;

-- 创建数据库
CREATE DATABASE IF NOT EXISTS school 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- 选择数据库
USE school;

-- 查看当前数据库
SELECT DATABASE();

-- 删除数据库
DROP DATABASE IF EXISTS school;

-- 修改数据库
ALTER DATABASE school CHARACTER SET gbk;

4.3 表操作

sql

复制代码
-- 创建表
CREATE TABLE IF NOT EXISTS students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age TINYINT UNSIGNED,
    gender ENUM('男', '女'),
    class_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 查看表结构
DESC students;
SHOW CREATE TABLE students;

-- 修改表
-- 添加字段
ALTER TABLE students ADD COLUMN phone VARCHAR(20) AFTER age;

-- 修改字段
ALTER TABLE students MODIFY COLUMN phone VARCHAR(30);

-- 重命名字段
ALTER TABLE students CHANGE COLUMN phone mobile VARCHAR(20);

-- 删除字段
ALTER TABLE students DROP COLUMN mobile;

-- 重命名表
RENAME TABLE students TO student_info;

-- 删除表
DROP TABLE IF EXISTS students;

-- 清空表
TRUNCATE TABLE students;

4.4 数据操作

sql

复制代码
-- 插入数据
INSERT INTO students (name, age, gender) VALUES 
('张三', 18, '男'),
('李四', 19, '女'),
('王五', 20, '男');

-- 查询数据
SELECT * FROM students;
SELECT id, name, age FROM students WHERE age > 18;
SELECT * FROM students ORDER BY age DESC LIMIT 10;

-- 更新数据
UPDATE students SET age = 19 WHERE name = '张三';

-- 删除数据
DELETE FROM students WHERE id = 3;

-- 聚合查询
SELECT gender, COUNT(*) as count, AVG(age) as avg_age 
FROM students 
GROUP BY gender;

五、用户与权限管理

5.1 用户管理

sql

复制代码
-- 查看所有用户
SELECT user, host, authentication_string FROM mysql.user;

-- 创建用户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY 'RemotePass456@';

-- 修改密码
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewPassword789#';

-- 删除用户
DROP USER 'app_user'@'localhost';

-- 重命名用户
RENAME USER 'old_user'@'localhost' TO 'new_user'@'localhost';

5.2 权限管理

sql

复制代码
-- 查看用户权限
SHOW GRANTS FOR 'app_user'@'localhost';

-- 授予权限
-- 授予所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';

-- 授予特定数据库的所有权限
GRANT ALL PRIVILEGES ON school.* TO 'app_user'@'localhost';

-- 授予部分权限
GRANT SELECT, INSERT, UPDATE ON school.* TO 'reader'@'localhost';

-- 授予列级权限
GRANT SELECT (name, age) ON school.students TO 'limited'@'localhost';

-- 撤销权限
REVOKE DELETE ON school.* FROM 'app_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

5.3 常用权限说明

权限 说明
ALL PRIVILEGES 除GRANT OPTION外的所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 更新数据
DELETE 删除数据
CREATE 创建数据库/表
DROP 删除数据库/表
ALTER 修改表结构
INDEX 创建/删除索引
GRANT OPTION 授予权限的权限

六、备份与恢复

6.1 逻辑备份(mysqldump)

bash

复制代码
# 备份单个数据库
mysqldump -u root -p school > school_backup.sql

# 备份多个数据库
mysqldump -u root -p --databases school blog > multiple_db.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_db.sql

# 只备份表结构,不备份数据
mysqldump -u root -p --no-data school > school_structure.sql

# 只备份数据,不备份表结构
mysqldump -u root -p --no-create-info school > school_data.sql

# 备份并压缩
mysqldump -u root -p school | gzip > school_backup.sql.gz

# 备份指定表
mysqldump -u root -p school students teachers > school_tables.sql

# 备份时添加条件
mysqldump -u root -p school students --where="age>18" > adult_students.sql