跳到主要内容

第3章 MySQL基础管理

MySQL服务管理

1. 启动与关闭

启动方式

常规启动

service mysqld start
systemctl start mysqld
/etc/init.d/mysqld start

前台启动(用于调试,日志输出到屏幕)

mysqld
mysqld_safe

mysqld与mysqld_safe

mysqld是MySQL的核心程序,负责管理数据库文件和处理用户请求,读取配置文件中的[mysqld]部分。

mysqld_safe是mysqld的守护进程包装器,提供以下功能:

  1. 启动并监控mysqld进程,发生异常时自动重启
  2. 将错误日志重定向到数据目录的host_name.err文件
  3. 读取配置文件的[mysqld]、[server]、[mysqld_safe]和[safe_mysqld]部分
  4. 支持通过--mysqld或--mysqld-version参数指定mysqld版本

1717331731295-cd4cf4d8-3c02-4fe2-8317-017a0896681d.webp

调试启动

用于故障排查或临时参数测试:

mysqld_safe --defaults-file=/etc/my.cnf &
mysqld --defaults-file=/etc/my.cnf &

关闭方式

常规关闭

service mysqld stop
systemctl stop mysqld
/etc/init.d/mysqld stop

SQL命令关闭

mysql -uroot -p123456 -e 'shutdown;'
# 或在MySQL控制台执行
mysql> shutdown;
注意

避免使用kill、pkill、killall命令关闭MySQL,严禁使用kill -9,可能导致数据损坏。

2. 配置文件管理

配置方法与优先级

MySQL支持三种配置方式:配置文件(主要方法)、命令行参数(特殊场景)、源码编译(较少使用)。

配置优先级:命令行 > 配置文件 > 编译默认值

配置文件加载顺序

mysqld --help --verbose | grep my.cnf
# 按顺序加载以下位置的配置文件:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
~/.my.cnf

当多个配置文件存在相同参数时,后加载的配置会覆盖先加载的配置。

手动指定配置文件

使用--defaults-file参数指定特定配置文件:

mysqld_safe --defaults-file=/opt/my.cnf &
mysqld --defaults-file=/opt/my.cnf &

自定义systemd服务

cat > /etc/systemd/system/mysqldd.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/opt/my.cnf
LimitNOFILE = 5000
EOF

配置文件格式

[mysqld]                     # 服务端标签
user=mysql # MySQL内置管理用户
basedir=/data/app/mysql # 软件目录
datadir=/data/3306/data # 数据目录
socket=/tmp/mysql.sock # socket文件生成目录
port=3306 # 端口号
server_id=1 # 主机编号(主从复制使用)

[mysql]
socket=/tmp/mysql.sock # 客户端连接使用的socket文件

常用配置标签

  • 服务端:[server](所有服务端程序)、[mysqld](mysqld程序)、[mysqld_safe](mysqld_safe程序)
  • 客户端:[client](所有客户端程序)、[mysql](mysql命令)、[mysqldump](mysqldump工具)

3. 连接管理

本地连接

# 创建本地用户
grant all on *.* to test@'localhost' identified by '123';

# 本地连接方式
mysql -utest -p123 # 默认socket连接
mysql -utest -p123 -S /tmp/mysql.sock # 指定socket文件

远程连接

# 创建远程用户
grant all on *.* to test1@'10.0.0.%' identified by '123';

# 远程连接
mysql -utest1 -p123 -h 10.0.0.51 -P3306

批处理操作

# 执行单条SQL
mysql -uroot -p123 -e "select user,host from mysql.user;"

# 导入SQL文件
mysql -uroot -p123 < world.sql

图形化工具

常用图形化管理工具:SQLyog、Navicat、MySQL Workbench

用户与权限管理

1. 用户管理

用户体系说明

MySQL用户与Linux用户独立,Linux用户管理系统文件,MySQL用户管理数据库对象。

MySQL用户定义格式:用户名@'白名单'

白名单示例

  • oldya@'localhost' - 仅允许本地socket连接
  • oldya@'10.0.0.10' - 仅允许指定IP连接
  • oldya@'10.0.0.%' - 允许10.0.0.0/24网段连接
  • oldya@'10.0.0.5%' - 允许10.0.0.50-59连接
  • oldya@'%' - 允许所有主机连接
  • oldya@'db01.oldya.com' - 允许指定域名连接

用户管理操作

# 查询用户
select user,host,authentication_string from mysql.user;

# 创建用户
create user oldya@'localhost'; # 无密码用户
create user oldya@'10.0.0.%' identified by '123'; # 带密码用户

# 修改密码
alter user oldya@'localhost' identified by '123'; # root修改其他用户
set password=password('123456'); # 用户修改自己密码

# 删除用户
drop user oldya@'localhost';

2. 权限管理

权限体系

MySQL权限系统控制用户对数据库对象的操作能力。查看所有可用权限:

show privileges;

授权语法

GRANT 权限列表 ON 权限范围 TO '用户'@'主机' IDENTIFIED BY '密码';

授权示例

# 创建远程管理员
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.0.0.%' IDENTIFIED BY '123456';

# 创建普通用户(指定权限和数据库)
grant select,update,delete,insert on test.* to test@'10.0.0.%' identified by '123';

# 查看用户权限
show grants for test@'10.0.0.%';

权限管理操作

# 回收权限
revoke delete on test.* from 'test'@'10.0.0.%';

# 删除用户
DROP USER '用户'@'主机';
提示

MySQL权限是累加的,多次授权会叠加权限而非覆盖。

权限表结构

1717331731275-043a9001-c9f5-4ae3-a603-bfc96feb7fa2.webp

3. 密码管理与恢复

密码设置与修改

初次设置root密码

mysqladmin -uroot password '123456'
mysqladmin -uroot password '123456' -S /tmp/mysql_3306.sock

修改密码方法

# 方法1:mysqladmin命令
mysqladmin -uroot -p123456 password '123'

# 方法2:SQL语句修改指定用户
set password for root@localhost = PASSWORD('123');

# 方法3:直接更新user表(MySQL 5.7)
UPDATE mysql.user SET authentication_string=PASSWORD("123456")
WHERE user='root' and host='localhost';

# 方法4:修改当前用户密码
set password=password('123456');
flush privileges;

root密码恢复

危险

密码恢复过程中数据库处于无认证状态,任何人都可以访问,请确保在安全环境中操作。

# 1. 停止MySQL服务
systemctl stop mysql

# 2. 以无授权模式启动
mysqld_safe --skip-grant-tables --user=mysql

# 3. 无密码登录
mysql

# 4. 修改root密码
UPDATE mysql.user SET authentication_string=PASSWORD("123456")
WHERE user='root' and host='localhost';

# 5. 重启MySQL服务
systemctl restart mysqld

# 6. 使用新密码登录
mysql -uroot -p123456