MySQL 基本管理

1. MySQL 软件架构

MySQL 采用 客户端/服务器(C/S) 架构,主要分为客户端工具和服务端组件:

# MySQL 服务端组件
mysqld  # MySQL的主服务器进程(守护进程),处理所有数据库请求

# MySQL 客户端工具
mysql  # 最常用的命令行客户端
mysqladmin  # 管理工具(创建/删除数据库、查看状态等)
mysqldump  # 数据库备份工具
Bash

2. 启动 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
Bash

3. 停止 MySQL

# 调用 mysqld 守护进程
/usr/sbin/mysqld stop

# 使用系统服务管理工具
systemctl stop mysqld
 
# 通过 mysqld_safe 启动的 mysql,可以用 mysqladmin 来关闭
mysqladmin -uroot -p123 shutdown  
 
# 无论如何都不建议使用
kill -9 pid
killall mysqld
pkill mysqld
Bash

4. MySQL 密码设置

# 修改 mysql 密码
mysqladmin -uroot -p"123" password "456"   

# 进入数据库内修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';  
Bash

5. 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
Bash

6. 配置文件解析

6.1. 配置文件加载顺序

# MySQL 会按以下顺序加载(后面的配置会覆盖前面的)
/etc/my.cnf
/etc/mysql/my.cnf
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
~/.my.cnf
--defaults-file 参数指定的文件
Bash

6.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] 的配置
Bash

7. 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
Bash

7.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
上一篇
下一篇