一、数据库概述
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