1. MySQL 软件架构
MySQL 采用 客户端/服务器(C/S) 架构,主要分为客户端工具和服务端组件:
# MySQL 服务端组件
mysqld # MySQL的主服务器进程(守护进程),处理所有数据库请求
# MySQL 客户端工具
mysql # 最常用的命令行客户端
mysqladmin # 管理工具(创建/删除数据库、查看状态等)
mysqldump # 数据库备份工具
Bash2. 启动 MySQL
# 使用系统服务管理工具
systemctl start mysqld
# 直接调用 mysqld 守护进程
# 前台运行(调试时有用)
/usr/sbin/mysqld --console
# 后台运行
/usr/sbin/mysqld --user=mysql &
# 使用 mysqld_safe 脚本
/usr/bin/mysqld_safe --defaults-file=/etc/my.cnf
Bash3. 停止 MySQL
# 调用 mysqld 守护进程
/usr/sbin/mysqld stop
# 使用系统服务管理工具
systemctl stop mysqld
# 通过 mysqld_safe 启动的 mysql,可以用 mysqladmin 来关闭
mysqladmin -uroot -p123 shutdown
# 无论如何都不建议使用
kill -9 pid
killall mysqld
pkill mysqld
Bash4. MySQL 密码设置
# 修改 mysql 密码
mysqladmin -uroot -p"123" password "456"
# 进入数据库内修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
Bash5. MySQL 客户端工具命令
mysql
# 常见的特定于客户机的连接选项:
-u: 指定用户 mysql -uroot
-p: 指定密码 mysql -uroot -p567
-h: 指定主机域 mysql -uroot -p567 -h127.0.0.1
-P: 指定端口 mysql -uroot -p567 -h127.0.0.1 -P3307
-S: 指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock
-e: 指定SQL语句(库外执行SQL语句) mysql -uroot -p567 -e "show databases;"
#--protocol: 指定连接方式 mysql --protocol=TCP --protocol=socket
Bash客户端连接服务端主要有 两种方式,分别基于不同的 认证协议 和 连接通道:
- TCP/IP 连接(网络套接字)
- 适用场景:远程访问(客户端与服务端不在同一台机器)。
- 连接方式:
mysql -h [服务器IP] -P [端口] -u [用户名] -p
- 配置要求:
# 服务端需监听 TCP/IP
# /etc/my.cnf 配置文件
[mysqld]
bind-address = 0.0.0.0 # 允许所有IP连接(或指定IP)
# 防火墙放行端口
firewall-cmd --add-port=3306/tcp --permanent && firewall-cmd --reload
# 用户权限允许远程链接
CREATE USER 'user'@'%' IDENTIFIED BY '密码'; -- 创建一个用户允许任意IP连接
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'; -- 授予该用户对所有数据库和所有表的全部权限
FLUSH PRIVILEGES; -- 重新加载权限表,使更改立即生效
Bash- Unix Socket 连接(本地套接字)
- 适用场景:客户端与服务端在同一台机器(如本地管理),无需网络协议栈,速度更快、安全性更高。
- 连接方式:
mysql -u [用户名] -p # 省略 -h 参数默认使用 Socket
# 或显式指定 Socket 文件路径
mysql -u [用户名] -p --socket=/var/lib/mysql/mysql.sock
Bash6. 配置文件解析
6.1. 配置文件加载顺序
# MySQL 会按以下顺序加载(后面的配置会覆盖前面的)
/etc/my.cnf
/etc/mysql/my.cnf
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
~/.my.cnf
--defaults-file 参数指定的文件
Bash6.2. 配置文件内容介绍
配置文件详细介绍官方文档:https://dev.mysql.com/doc/refman/8.4/en/server-options.html
以下是一些常用的配置项:
# 服务端配置
[mysqld]
# 基本设置
datadir=/var/lib/mysql # 数据目录
socket=/var/lib/mysql/mysql.sock # Unix Socket 文件路径
pid-file=/var/run/mysqld/mysqld.pid # PID 文件路径
user=mysql # 运行 MySQL 的用户
port=3306 # 监听端口
bind-address=0.0.0.0 # 允许所有IP连接(生产环境建议限制为具体IP)
# 支持向数据库内存入 Emoji 表情符号
character-set-server=utf8mb4
collation-server=utf8_general_ci
# 设置库名和表名不区分大小写
# 开发时,数据库的库名和表名都要小写,因为很多研发使用第三方工具连接数据库,而 windows不区分大小写, linux区分大小写,很容易读写错数据库;
lower_case_table_names=1
# 内存与缓存优化
# 缓冲池大小(推荐占物理内存的 50%-70%)
innodb_buffer_pool_size=4G
# 日志缓冲区大小(默认 16MB,可适当增加)
innodb_log_buffer_size=32M
# 查询缓存(MySQL 8.0+ 已移除,5.7 可酌情启用)
query_cache_type=0 # 0=关闭,1=启用,2=按需
query_cache_size=0 # 查询缓存大小(建议 64M-256M)
# 连接数控制
max_connections=500 # 最大连接数(默认 151)
thread_cache_size=100 # 线程缓存(减少线程创建开销)
# 日志与持久化
# 错误日志
log_error=/var/log/mysqld.log
# 慢查询日志(记录执行时间超过 long_query_time 的SQL)
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2 # 慢查询阈值(秒)
log_queries_not_using_indexes=1 # 记录未使用索引的查询
# Binlog(主从复制/数据恢复)
server_id=1 # 服务器唯一ID(主从环境必设)
log_bin=/var/log/mysql/mysql-bin.log
binlog_format=ROW # ROW 模式(推荐)
expire_logs_days=7 # Binlog 保留天数
sync_binlog=1 # 每次事务提交都刷盘(确保数据安全)
# InnoDB 存储引擎优化
# InnoDB 事务日志
innodb_log_file_size=512M # 日志文件大小(推荐 256M-2G)
innodb_log_files_in_group=2 # 日志组数量(默认 2)
# 刷盘策略(平衡性能与数据安全)
innodb_flush_method=O_DIRECT # 直接IO(减少内核缓存开销)
innodb_flush_log_at_trx_commit=1 # 1=每次提交刷盘(最安全),2=每秒刷盘(性能更好)
# 并发控制
innodb_thread_concurrency=0 # 0=自动调整(推荐)
innodb_read_io_threads=8 # 读IO线程数(默认4)
innodb_write_io_threads=8 # 写IO线程数(默认4)
# 通用客户端配置
[client]
port=3306 # 默认端口
socket=/var/lib/mysql/mysql.sock # Unix Socket 路径
# 连接超时和交互设置
connect_timeout=10 # 连接超时(秒)
default-character-set=utf8mb4 # 默认字符集(推荐 utf8mb4)
# 安全相关
ssl-mode=PREFERRED # 优先使用SSL加密(可选 REQUIRED)
ssl-ca=/etc/mysql/ssl/ca.pem # CA证书路径(如启用SSL)
# mysql 客户端配置
[mysql]
# 如果该项未配置,mysql 命令配置使用 [client] 的配置
Bash7. MySQL 客户端相关命令
7.1. MySQL 客户端命令行快捷命令
\c # 中断当前输入语句
\r # 重新连接到服务器
\d # 设置 sql 语句结束符
# 示例:
mysql> \d //
# 修改前 show databases; 修改后 show databases//
\e # \e 会将 当前输入缓冲区(未执行的SQL语句) 发送到系统默认的文本编辑器(如 vim、nano 或 notepad),允许你修改后再执行。
# 示例:输入 SQL 语句(不要加分号 ;)
mysql> SELECT * FROM users WHERE id = 1 \e
\p # 打印当前输入缓冲区的 SQL 语句(即已经输入但尚未执行的语句)。它的主要作用是 预览即将执行的 SQL,而不会真正执行它。
# 示例:输入 SQL 语句(不要加分号 ;)
mysql> SELECT * FROM users WHERE id = 1 \p
\G # 将查询结果的每一行数据以 字段: 值 的垂直形式显示(替代默认的横向表格)
# 示例:
mysql> SELECT * FROM users WHERE id = 1 \G
\q # 退出 mysql
\g # 表示结束,等于 ; 的作用
\h # 显示此帮助等于 help ,help 还可以查看命令语法 help create database;
\T # 所有查询结果既显示在屏幕上,又追加写入指定文件。(只支持本次会话)
# 示例:
\T /tmp/a.log
\R # 更改 mysql 提示符
# 示例:
\R \u@\h [\d]>\_
# \u 用户名
# \h 主机名
# \d 当前数据库名称
# \_ 空格
# 永久修改,添加到配置文件
[mysql]
prompt=\\u@\\h [\\d]>\\_
\. # 执行SQL脚本文件,将文件名作为参数。
\s # 从服务器获取状态信息
\u # 切换数据库,等于 use
Bash7.2. mysqladmin 命令
# 1.修改密码
[root@db01 ~]# mysqladmin -uroot -p旧密码 password '新密码'
# 2.关闭MySQL服务:shutdown
[root@db01 ~]# mysqladmin -uroot -p密码 -S socket文件 shutdown
# 3.库外建库:create
[root@db01 ~]# mysqladmin -u root -p密码 create mynewdb
# 验证是否创建成功,-e 指定要执行的 SQL 语句,通常在非交互式环境使用
[root@db01 ~]# mysql -u root -p密码 -e "SHOW DATABASES;"
# 4.库外删除数据库:drop
[root@db01 ~]# mysqladmin -uroot -p密码 drop mynewdb
# 5.查看配置文件所有的默认参数:variables
[root@db01 ~]# mysqladmin -uroot -p密码 variables
[root@db01 ~]# mysqladmin -uroot -p密码 variables | grep server_id
# 6.检测MySQL进程是否存活:ping
[root@db01 ~]# mysqladmin -uroot -p密码 ping
# 7.查看数据库慢查询,负载信息:status
[root@db01 ~]# mysqladmin -uroot -p密码 status
Uptime # MySQL服务器已经运行的秒数
Threads # 活跃线程(客户)的数量
Questions # 从mysqld启动起来自客户问题的数量 已经发送给服务器的查询的个数
Slow queries # 已经超过long_query_time秒的查询数量
Opens # mysqld已经打开了多少表
Flush tables # flush ..., refresh和reload命令数量
Open tables # 现在被打开的表数量
Queries per second avg: 0.046 # 负载
# 8.重载授权表,刷新缓存主机:reload,相当于 flush privileges;
[root@db01 ~]# mysqladmin -uroot -p密码 reload
# 9.刷新binlog日志
[root@db01 ~]# mysqladmin -uroot -p密码 flush-log
Bash