一、安装 MySQL
sql
sudo apt update
sudo apt install mysql-server -y
二、检查与管理 MySQL 服务
sql
mysql --version # 查看版本
sudo systemctl start mysql # 启动 MySQL
sudo systemctl stop mysql # 停止 MySQL
sudo systemctl restart mysql # 重启 MySQL
sudo systemctl status mysql # 查看状态
sudo systemctl enable mysql # 设置开机自启
sudo systemctl is-enabled mysql # 检查是否已设置开机自启
三、登录 MySQL
sql
sudo mysql
登录成功后,提示符变为
mysql>。
四、基本操作测试
sql
show databases;
select version();
exit;
五、设置 root 密码
在 MySQL 中执行以下命令:
sql
alter user 'root'@'localhost' identified with mysql_native_password by '你的密码';
flush privileges;
设置后,下次登录需使用:
sql
mysql -u root -p
bash
mysql -h 127.0.0.1 -P 3306 -u root -p
| 参数 | 含义 |
|---|---|
-h |
主机地址 |
-P |
端口号(大写 P) |
-u |
用户名 |
-p |
需要输入密码 |
注意: 密码输入时不会显示,直接输入即可。
六、安全配置
sql
sudo mysql_secure_installation
按提示完成以下配置:
| 选项 | 你的选择 | 实际操作与效果 |
|---|---|---|
| 1. 密码验证组件 | n (否) |
没有安装 密码强度检查工具。这意味着之后你可以设置任意简单密码(如 123456),不会强制要求复杂密码。适合个人开发环境。 |
| 2. 移除匿名用户 | y (是) |
删除了允许空用户名连接的匿名账户。效果:任何人都无法再无需账号直接访问你的数据库。 |
| 3. 禁止 root 远程登录 | y (是) |
禁止 root 账户从其他机器(如你的另一台电脑)连接数据库。效果:root 只能从本机(localhost)登录,大大降低了被远程暴力破解的风险。 |
| 4. 移除测试数据库 | y (是) |
删除 了名为 test 的示例数据库及其所有访问权限。效果:数据库列表更干净,也避免了因该库默认权限宽松带来的潜在风险。 |
| 5. 重载权限表 | y (是) |
立即生效 以上所有更改,相当于执行了一次 FLUSH PRIVILEGES;。效果:无需重启 MySQL 服务,安全设置就立刻应用了。 |
禁用了密码强度检查,删除了匿名用户和测试库,禁止了 root 远程登录,让 MySQL 从一个"默认开放"的状态变成了一个"基本安全"的状态,非常适合个人开发环境。
七、快速验证命令
bash
sudo mysql -e "SELECT VERSION(); SHOW DATABASES;"
八、MySQL 目录结构
| 路径 | 说明 |
|---|---|
/etc/mysql/ |
配置文件目录 |
/var/lib/mysql/ |
数据库数据存储目录 |
/var/log/mysql/ |
日志文件目录 |
九、MySQL 核心概念
| 命令 | 说明 |
|---|---|
mysql |
数据库客户端 |
mysqld |
数据库服务端 |
数据库本质: 对数据内容存储的一套解决方案。
在 Linux 中:
建立数据库 → 在
/var/lib/mysql下创建一个目录建立表 → 在该目录下创建对应的文件
数据库本质也是文件,但由数据库服务统一管理,不直接由程序员操作
十、编码集说明
| 术语 | 说明 |
|---|---|
| 数据库编码集 | 数据库未来存储数据使用的编码 |
| 数据库校验集 | 支持字段比较使用的编码,本质是读取数据时采用的编码格式 |
MySQL 8.0 新特性: 引入了全新的"数据字典",将所有数据库的元数据(包括字符集信息)统一管理,因此不再需要
db.opt这类分散的元数据文件。
十一、SQL 分类
| 分类 | 全称 | 说明 | 代表指令 |
|---|---|---|---|
| DDL | Data Definition Language | 维护存储数据的结构 | create、drop、alter |
| DML | Data Manipulation Language | 对数据进行操作 | insert、delete、update |
| DQL | Data Query Language | 数据查询(DML 子集) | select |
| DCL | Data Control Language | 权限管理和事务 | grant、revoke、commit |
十二、存储引擎
存储引擎是数据库管理系统如何存储数据、如何建立索引、如何更新和查询数据等技术的实现方法。
MySQL 核心特性: 插件式存储引擎,支持多种存储引擎。
查看支持的存储引擎:
sql
show engines;
十三、数据库操作
13.1 创建数据库
sql
create database [if not exists] db1;
创建指定字符集和校验规则的数据库:
sql
create database db2 charset=utf8 collate utf8_general_ci;
13.2 查看字符集与校验规则
sql
show variables like 'character_set_database';
show variables like 'collation_database';
show charset; -- 查看支持的字符集
show collation; -- 查看支持的校验规则
13.3 查看数据库
sql
show databases;
13.4 查看建库语句
sql
show create database 数据库名;
13.5 修改数据库
sql
alter database mytest charset=gbk;
13.6 删除数据库
sql
drop database [if exists] 数据库名;
13.7 查看当前使用哪个库
sql
SELECT DATABASE();
十四、数据库备份与恢复
14.1 备份
| 项目 | 无密码模式 | 有密码模式 |
|---|---|---|
| 认证方式 | Unix socket(系统用户认证) | mysql_native_password(密码认证) |
| 备份命令 | sudo mysqldump -u root -B 库名 > 备份.sql |
mysqldump -u root -p密码 -B 库名 > 备份.sql |
| 是否需要 sudo | ✅ 需要 | ❌ 不需要 |
| -p 参数 | 不写 | 必须写 |
| 你的测试结果 | ✅ 成功 | ❌ 报错 1698 |
示例:
sql
mysqldump -P3306 -u root -p123456 -B mytest > D:/mytest.sql
14.2 备份多张表
sql
mysqldump -u root -p 数据库名 表名1 表名2 > 备份文件路径.sql
14.3 备份多个数据库
sql
mysqldump -u root -p -B 数据库名1 数据库名2 ... > 备份文件路径.sql
14.4 恢复数据库
# 终端执行 sudo mysql < backup.sql # 登录后执行 sudo mysql mysql> source backup.sql;注意: 如果备份时没有带
-B参数,需要先创建空数据库,再使用source恢复。
参数 备份文件包含 带 -BCREATE DATABASE+CREATE TABLE+ 数据不带 -B只有 CREATE TABLE+ 数据(没有建库语句)
十五、查看连接情况
sql
show processlist;
可以查看当前有哪些用户连接到 MySQL。
十六、表操作
16.1 创建表
sql
create table table_name (
列名1 类型,
列名2 类型,
列名3 类型
) character set 字符集 collate 校验规则 engine 存储引擎;
不同的存储引擎,创建表时生成的文件不一样。
16.2 查看表结构
sql
desc 表名; -- 简洁版
show create table 表名 \G -- 完整版(含引擎、字符集)
16.3 修改表结构
sql
-- 添加列
alter table 表名 add (列名 数据类型 [default 默认值]);
-- 修改列
alter table 表名 modify (列名 新数据类型 [default 新默认值]);
-- 删除列
alter table 表名 drop (列名);
⚠️ 警告: 删除字段要小心,字段及其对应的列数据都没了。
16.4 修改表示例
sql
create table emp (
id number,
name varchar2(20)
);
alter table emp add (age number default 18, hire_date date);
alter table emp modify (name varchar2(50) default '匿名', age number default 20);
alter table emp drop (hire_date);
16.5 删除表
sql
drop table 表名;
十七、MySQL 常用数据类型
17.1 数值类型
| 类型 | 字节 | 范围 | 用途 |
|---|---|---|---|
tinyint |
1 | -128~127 | 年龄、状态 |
int |
4 | -21亿~21亿 | id、数量 ✅ |
bigint |
8 | 超大 | 流水号 |
decimal(m,d) |
可变 | 精确小数 | 金额 ✅ |
17.2 小数类型细节
| 类型 | 说明 | 特点 |
|---|---|---|
float |
单精度 | 4字节,有精度误差 |
double |
双精度 | 8字节,有精度误差 |
decimal(m,d) |
精确小数 | 无精度误差,金融必用 ✅ |
sql
salary decimal(10,2) -- 总10位,小数2位,范围 -99999999.99 ~ 99999999.99
17.3 字符串类型
| 类型 | 最大长度 | 用途 |
|---|---|---|
char(n) |
255 | 固定长度(手机号、身份证) |
varchar(n) |
65535 | 可变长度 ✅ |
text |
65535 | 长文本(文章、备注) |
17.4 enum 和 set
| 类型 | 说明 | 特点 |
|---|---|---|
enum |
单选 | 从预定义值中选一个 |
set |
多选 | 从预定义值中选多个 |
sql
gender enum('男','女','保密') default '保密'; -- 单选
hobby set('篮球','足球','音乐','读书'); -- 多选(可存 '篮球,音乐')
set 查询函数:
sql
select * from user where find_in_set('篮球', hobby); -- 查找爱好包含篮球的用户
17.5 日期时间类型
| 类型 | 格式 | 用途 |
|---|---|---|
date |
yyyy-mm-dd | 生日、日期 |
datetime |
yyyy-mm-dd hh:mm:ss | 常用 ✅ |
timestamp |
yyyy-mm-dd hh:mm:ss | 自动更新 |
17.6 bit 类型
| 类型 | 说明 | 用途 |
|---|---|---|
bit(n) |
二进制位,n=1~64 | 存储标志位(0/1) |
sql
is_vip bit(1) default b'0'; -- 0表示否,1表示是
status bit(2); -- 可存 00,01,10,11
insert into user (is_vip) values (b'1');
17.7 常用速查表
| 用途 | 推荐类型 |
|---|---|
| id、数量 | int |
| 年龄、状态 | tinyint |
| 金额 | decimal(10,2) ✅ |
| 姓名、标题 | varchar(50) |
| 手机号 | char(11) |
| 文章内容 | text |
| 性别(单选) | enum('男','女') |
| 爱好(多选) | set |
| 是否 VIP(二选一) | bit(1) |
| 创建时间 | datetime |
17.8 完整建表示例
sql
create table user (
id int primary key auto_increment,
name varchar(50) not null,
age tinyint default 18,
phone char(11),
salary decimal(10,2),
gender enum('男','女','保密') default '保密',
hobby set('篮球','足球','音乐','读书'),
is_vip bit(1) default b'0',
create_time datetime default current_timestamp
);
17.9 set 查询示例
sql
-- 查找爱好包含篮球的用户
select * from user where find_in_set('篮球', hobby);
-- 查找是 VIP 的用户
select * from user where is_vip = b'1';