MySQL8 是一款功能强大且开源的(遵循GPL协议)关系型数据库管理系统(RDBMS)。
本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。
1.MySQL8 的安装
1、打开 MySQL8 官方网站下载页面【https://dev.mysql.com/downloads/repo/yum/】,下载并安装 yum 源到用户主目录中。
[centos@host ~]$ sudo rpm -ivh mysql80-community-release-el8-1.noarch.rpm
注意:如果使用本地或私有yum源,可忽略本步骤,直接获取本地/私有yum源的配置文件使用即可。有关如何进行yum源的本地化/私有化,请阅读文章《RedHat/CentOS8 【国内/本地/私有 YUM 源】制作和使用》,文章地址【https://www.jianshu.com/p/68db74388600】。
2、禁用系统内置 yum 源的 MySQL 安装模块。
CentOS8 的内置 yum 源中已经提供 MySQL 安装模块(但比官方提供的版本要旧),而在执行安装命令时,内置 yum 源的优先级高于其他 yum 源,因此要禁用内置 yum 源的 MySQL 安装模块。
[centos@host ~]$ sudo dnf module disable mysql
3、安装 MySQL8 的服务器端程序。
[centos@host ~]$ sudo dnf install mysql-server mysql
注意:程序文件在"/usr/bin"目录中,配置文件是"/etc/my.cnf",套接字文件在"/var/lib/mysql"目录中,运行时文件在"/var/run/mysqld"目录中,日志文件在"/var/log"目录中,程序运行用户和组是"mysql:mysql","mysql"用户和组安装时默认创建。
2.MySQL8 的配置
1、设置数据库实例的数据存储目录。
数据库实例的默认数据存储目录是"/var/lib/mysql"。"/var"是一个系统目录,不宜存放大量业务数据,通常的解决方案是在系统中挂载一块数据盘,专门用于存储业务数据。因此需要在初始化数据库实例之前设置数据存储目录。假设本例中使用"/data"目录挂载数据盘,具体操作如下:
创建数据存储目录、错误日志目录、数据备份目录,并设置所有者用户和组为"mysql:mysql","mysql"用户和组在安装 MySQL8 时已创建。
[centos@host ~]$ sudo mkdir -p /data/mysql/data
[centos@host ~]$ sudo mkdir -p /data/mysql/log
[centos@host ~]$ sudo mkdir -p /data/mysql/backup
[centos@host ~]$ sudo chown -R mysql:mysql /data/mysql
2、设置 MySQL8 数据库配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~]$ sudo gedit /etc/my.cnf
修改或验证文件中的以下参数并保存:
[mysqld]
# 数据存储目录,默认是/var/lib/mysql。建议存储到数据盘中。
datadir=/data/mysql/data
# 日志文件位置,默认是/var/log/mysqld.log。建议存储到数据盘中。
log-error=/data/mysql/log/mysqld.log
# 套接字文件位置,默认是/var/lib/mysql/mysql.sock。
socket=/var/lib/mysql/mysql.sock
# 运行时文件位置,默认是/var/run/mysqld/mysqld.pid。
pid-file=/var/run/mysqld/mysqld.pid
# 服务运行管理账户,默认是mysql。
# user=mysql
# 服务监听端口号,默认是3306。
# port=3306
# 跳过 IP 地址反向解析域名,默认不启用。
# skip-name-resolve
# 跳过身份认证,默认不启用。
# skip-grant-tables
# 跳过远程链接,默认不启用。
# skip-networking
3、设置数据库实例超级管理员账户"mysql"的口令。MySQL8 安装完成后"mysql"的默认口令为空,为空时无法使用该用户在本地登录数据库。
[centos@host ~]$ sudo passwd mysql
更改用户 mysql 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
4、在SELinux模式运行时,设置自定义目录的安全标记和安全策略。
[centos@host ~]$ sudo semanage fcontext -a -t mysqld_db_t "/data/mysql/data(/.*)?"
[centos@host ~]$ sudo semanage fcontext -a -t mysqld_log_t "/data/mysql/log(/.*)?"
[centos@host ~]$ sudo restorecon -Rv /data/mysql/data
[centos@host ~]$ sudo restorecon -Rv /data/mysql/log
5、修改或验证 MySQL8 开机启动服务配置文件。
使用文本编辑器打开配置文件:
[centos@host ~]$ sudo gedit /usr/lib/systemd/system/mysqld.service
修改或验证文件中的以下参数并保存:
[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
Type=notify
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
ExecStartPre=/usr/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 10000
Restart=on-failure
RestartPreventExitStatus=1
# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
6、启动数据库实例服务,并设置为开机自动启动。
[centos@host ~]$ sudo systemctl daemon-reload
[centos@host ~]$ sudo systemctl start mysqld.service
[centos@host ~]$ sudo systemctl enable mysqld.service
7、开启远程访问策略。
1)设置防火墙端口(CentOS8默认安装firewall防火墙),允许"3306"端口(MySQL 默认端口)访问服务器。
[centos@host ~]$ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
[centos@host ~]$ sudo firewall-cmd --reload
2)在SELinux模式运行时,开启远程访问安全策略。
[centos@host ~]$ sudo setsebool -P mysql_connect_any 1
8、设置数据库超级管理员"root"账号的口令。
【首选方案(已安装 mysql-client 时可用)】
1)初始化 "root" 账号的口令。
[centos@host ~]$ mysqladmin -u root password "password"
2)使用"root"账号登录客户端,设置新的口令和策略。密码要包含大写字母,小写字母,数字,特殊符号。
[centos@host ~]$ mysql -u root -p
Enter password:
# 初始化root账号本地登录的口令。
# 格式:alter user '<账号>'@'<客户端IP策略>' identified by '<登录密码>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
mysql> alter user 'root'@'localhost' identified by 'password';
# 创建root账号远程登录的策略和口令。
# 格式:create user '<账号>'@'<客户端IP策略>' identified with mysql_native_password by '<登录密码>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
# with mysql_native_password 表示设置的口令可同时用于远程访问(不指定时用于本地访问)。
mysql> create user 'root'@'%' identified with mysql_native_password by 'password';
# 格式:grant all privileges on <库名>.<表名> to '<用户名>'@'<客户端IP策略>';
# 说明:
# <库名>和<表名>可以使用通配符”*”代替,表示全部数据库或全部表;
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
mysql> grant all on *.* to 'root'@'%';
# 刷新用户权限。
mysql> flush privileges;
# 连接 mysql 数据库,默认数据库。
mysql>use mysql;
# 查询已有的策略。
mysql> select user,host,authentication_string from user\G;
# 退出客户端。
mysql> exit;
【备选方案(未安装 mysql-client 时可用)】
MySQL数据库安装后,因"root"账号未设置口令所以无法远程登录,需要在服务器上临时使用本地用户免密登录后设置"root"账号的口令才能正常使用。
注意:本地用户免密登录和远程登录不可共同开启。
1)使用文本编辑器打开配置文件,修改或验证文件中的以下参数并保存。
[centos@host ~]$ sudo gedit /etc/my.cnf
[mysqld]
# 开启以下两项设置后,仅能够通过本地访问数据库,使用超级管理员身份登录且不需要进行身份认证。
# 跳过身份认证,默认不启用。
skip-grant-tables
# 跳过远程链接,默认不启用。
skip-networking
2)重新启动服务。
[centos@host ~]$ sudo systemctl restart mysqld.service
3)免密登录客户端并清除"root"账号口令。
[centos@host ~]$ mysql
# 连接 mysql 数据库,默认数据库。
mysql>use mysql;
# 更新 root 账号口令为空(不能设置其他口令)。
mysql>update user set authentication_string='' where user='root';
# 退出客户端。
mysql> exit;
4)使用文本编辑器打开配置文件,修改或验证文件中的以下参数并保存。
[centos@host ~]$ sudo gedit /etc/my.cnf
[mysqld]
# 开启以下两项设置后,仅能够通过本地访问数据库,使用超级管理员身份登录且不需要进行身份认证。
# 跳过身份认证,默认不启用。
# skip-grant-tables
# 跳过远程链接,默认不启用。
# skip-networking
5)重新启动服务。
[centos@host ~]$ sudo systemctl restart mysqld.service
6)使用"root"账号登录客户端,设置新的口令和策略。密码要包含大写字母,小写字母,数字,特殊符号。
[centos@host ~]$ mysql -u root
# 初始化root账号本地登录的口令。
# 格式:alter user '<账号>'@'<客户端IP策略>' identified by '<登录密码>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
mysql> alter user 'root'@'localhost' identified by 'password';
# 创建root账号远程登录的策略和口令。
# 格式:create user '<账号>'@'<客户端IP策略>' identified with mysql_native_password by '<登录密码>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
# with mysql_native_password 表示设置的口令可同时用于远程访问(不指定时用于本地访问)。
mysql> create user 'root'@'%' identified with mysql_native_password by 'password';
# 格式:grant all privileges on <库名>.<表名> to '<用户名>'@'<客户端IP策略>';
# 说明:
# <库名>和<表名>可以使用通配符”*”代替,表示全部数据库或全部表;
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
mysql> grant all on *.* to 'root'@'%';
# 刷新用户权限。
mysql> flush privileges;
# 连接 mysql 数据库,默认数据库。
mysql>use mysql;
# 查询已有的策略。
mysql> select user,host,authentication_string from user \G;
# 退出客户端。
mysql> exit;
3.MySQL8 的管理
1、启动数据库
[centos@host ~]$ sudo systemctl start mysqld.service
2、停止数据库
[centos@host ~]$ sudo systemctl stop mysqld.service
3、重启数据库
[centos@host ~]$ sudo systemctl restart mysqld.service
4、查看数据库状态、进程、端口
[centos@host ~]$ sudo systemctl status mysqld.service
[centos@host ~]$ sudo ps -ef | grep mysqld
[centos@host ~]$ sudo netstat -ntap | grep mysqld
5、开启数据库开机自启动
[centos@host ~]$ sudo systemctl enable mysqld.service
6、禁用数据库开机自启动
[centos@host ~]$ sudo systemctl disable mysqld.service
7、本地客户端登录数据库
[centos@host ~]$ mysql -u root -p
Enter password:
mysql>
8、迁移数据库
1)停止数据库。
[centos@host ~]$ sudo systemctl stop mysqld.service
2)创建新的目录,迁移数据库的相关文件,并为新的目录设置安全标签。
[centos@host ~]$ sudo mkdir -p /data/new-mysql/data
[centos@host ~]$ sudo mkdir -p /data/new-mysql/log
[centos@host ~]$ sudo mkdir -p /data/new-mysql/backup
[centos@host ~]$ sudo chown -R mysql:mysql /data/new-mysql
[centos@host ~]$ sudo cp -a /data/mysql/data /data/new-mysql/data
[centos@host ~]$ sudo cp -a /data/mysql/log /data/new-mysql/log
[centos@host ~]$ sudo cp -a /data/mysql/backup /data/new-mysql/backup
[centos@host ~]$ sudo semanage fcontext -a -t mysqld_db_t "/data/new-mysql/data(/.*)?"
[centos@host ~]$ sudo semanage fcontext -a -t mysqld_log_t "/data/new-mysql/log(/.*)?"
[centos@host ~]$ sudo restorecon -Rv /data/new-mysql/data
[centos@host ~]$ sudo restorecon -Rv /data/new-mysql/log
3)使用文本编辑器打开配置文件,修改或验证文件中的以下参数并保存。
[centos@host ~]$ sudo gedit /etc/my.cnf
[mysqld]
# 数据存储目录,默认是/var/lib/mysql。建议存储到数据盘中。
datadir=/data/new-mysql/data
# 日志文件位置,默认是/var/log/mysqld.log。建议存储到数据盘中。
log-error=/data/new-mysql/log/mysqld.log
4)启动数据库。
[centos@host ~]$ sudo systemctl start mysqld.service
9、管理用户和客户端的策略
1)创建新的用户和客户端策略:
[centos@host ~]$ mysql -u root -p
Enter password:
# 格式:create user '<账号>'@'<客户端IP策略>' identified with mysql_native_password by '<登录密码>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
# with mysql_native_password 表示设置的口令可同时用于远程访问(不指定时用于本地访问)。
mysql> create user 'root'@'%' identified with mysql_native_password by 'password';
mysql> flush privileges;
mysql> exit;
2)修改现有的用户和客户端管理策略:
[centos@host ~]$ mysql -u root -p
Enter password:
# 格式:alter user '<账号>'@'<客户端IP策略>' identified with mysql_native_password by '<登录密码>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
# with mysql_native_password 表示设置的口令可同时用于远程访问(不指定时用于本地访问)。
mysql> alter user 'root'@'%' identified with mysql_native_password by 'password';
mysql> flush privileges;
mysql> exit;
3)删除现有的用户和客户端策略:
[centos@host ~]$ mysql -u root -p
Enter password:
# 格式:drop user '<账号>'@'<客户端IP策略>';
# 说明:
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
mysql> drop user 'root'@'%';
mysql> flush privileges;
mysql> exit;
4)为用户和客户端授予访问权限:
[centos@host ~]$ mysql -u root -p
Enter password:
# 格式:grant all privileges on <库名>.<表名> to '<用户名>'@'<客户端IP策略>';
# 说明:
# <库名>和<表名>可以使用通配符”*”代替,表示全部数据库或全部表;
# <客户端IP策略>可以使用通配符”%”,也可以指定具体IP地址或地址段,如:
# 允许全部远程地址访问,设置为:”%”;
# 允许IP地址访问,设置为:”192.168.0.1”;
# 允许IP地址段访问,设置为:”192.168.0.%”。
mysql> grant all on *.* to 'root'@'%';
mysql> flush privileges;
mysql> exit;
5)查询已有的客户端策略:
[centos@host ~]$ mysql -u root -p
Enter password:
mysql> use mysql;
mysql> select user,host,authentication_string from user \G;
mysql> exit;
4.MySQL8 备份数据库
1、备份库
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --database 数据库名 > 文件名.sql
例如:
[centos@host ~]$ mysqldump -h 192.168.0.1 -p 3306 -u root -p password --database cmdb > /data/mysql/backup/cmdb.sql
2、备份库并压缩
导出的数据有可能比较大,不好备份到远程,这时候就需要进行压缩。
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --database 数据库名 | gzip > 文件名.sql.gz
例如:
[centos@host ~]$ mysqldump -h 192.168.0.1 -p 3306 -u root -p password --database cmdb | gzip > /data/mysql/backup/cmdb.sql.gz
3、备份同个库多个表
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --database 数据库名 表1 表2 .... > 文件名.sql
例如:
[centos@host ~]$ mysqldump -h 192.168.1.100 -p 3306 -u root -p password cmdb t1 t2 > /data/mysql/backup/cmdb_t1_t2.sql
4、同时备份多个库
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --databases 数据库名1 数据库名2 数据库名3 > 文件名.sql
例如:
[centos@host ~]$ mysqldump -h 192.168.0.1 -u root -p password --databases cmdb bbs blog > /data/mysql/backup/mutil_db.sql
5、备份实例上所有的数据库
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --all-databases > 文件名.sql
例如:
[centos@host ~]$ mysqldump -h 192.168.0.1 -u root -p password --all-databases > /data/mysql/backup/all_db.sql
6、备份数据库(含已删除数据库或者表的sql备份)
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --add-drop-table --add-drop-database 数据库名 > 文件名.sql
例如:
[centos@host ~]$ mysqldump -h 192.168.0.1 -u root -p password --add-drop-table --add-drop-database cmdb > /data/mysql/backup/all_db.sql
7、备份数据库结构,不备份数据
格式:mysqldump -h 主机名 -p 端口 -u 用户名 -p 密码 --no-data 数据库名1 数据库名2 数据库名3 > 文件名.sql
例如:
[centos@host ~]$ mysqldump -h 192.168.0.1 -u root -p password --no-data –databases db1 db2 cmdb > /data/mysql/backup/structure.sql
8、恢复数据库
格式:mysql -h 主机名 -p 端口 -u 用户名 -p 密码 < 文件名.sql
例如:
[centos@host ~]$ mysql -h 192.168.0.1 -u root -p password < /data/mysql/backup/structure.sql
4.MySQL8 导入数据
1、语法:
格式:mysqlimport -h 主机名 -p 端口 -u 用户名 -p 密码 [--local] dbname file [option]
2、说明:
- [--local]:表示从客户端任意路径读取文件导入表中,未设置该选项时,默认只从 datadir 下同名数据库目录下读取文件导入;
- dbname:表示数据库名称;
- file:表示数据文本文件的路径和名称;
- [option]:表示附加选项,如下:
--fields-terminated-by=字符串:设置字符串为字段的分隔符,默认值是“\t”;
--fields-enclosed-by=字符:设置字符来括上字段的值;
--fields-optionally-enclosed-by=字符:设置字符括上char、varchar、text等字符型字段;
--fields-escaped-by=字符:设置转义字符;
--lines-terminated-by=字符串:设置每行的结束符;
--ignore-lines=n:表示可以忽略前几行。
3、示例(导入文本到数据库):
[centos@host ~]$ mysqlimport -h 192.168.0.1 -u root -p password mysqldb data.txt
注意:本例中数据库名称是"mysqldb",导入数据的表名是"data",导入的数据文件名是"data.txt",导入数据表名与数据文件的主文件名必须是一致的。