1. 概况
主节点:mysql-m
从节点:mysql-s
【mysql-m、mysql-s上操作】
cat >> /etc/hosts << EOF
192.168.6.176 mysql-m
192.168.6.177 mysql-s
EOF
2. yum安装MySQL8
【mysql-m、mysql-s上操作】
关闭防火墙:systemctl disable firewalld --now
目录准备:mkdir /soft && cd /soft
下载相应Linux版本的MySQL的yum源:https://dev.mysql.com/downloads/repo/yum/
下载 mysql80-community-release-el7-7.noarch.rpm,上传到 /soft
安装rpm包: rpm -Uvh mysql80-community-release-el7-7.noarch.rpm 检查rpm包是否安装成功: yum repolist enabled | grep "mysql.*-community.*"
注:假如要修改安装版本,可以 vi /etc/yum.repos.d/mysql-community.repo,修改里面的 enabled 字段。
yum repolist all | grep mysql
修改mysql的yum镜像源为清华源(mysql官方源在国内非常慢!):
参考:https://mirror.tuna.tsinghua.edu.cn/mysql/yum/
vim /etc/yum.repos.d/mysql-community.repo,修改(enabled=1的几处):
[mysql80-community]
name=MySQL 8.0 Community Server
#baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
baseurl=https://mirror.tuna.tsinghua.edu.cn/mysql/yum/mysql80-community-el7/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql-connectors-community]
name=MySQL Connectors Community
#baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/7/$basearch/
baseurl=https://mirror.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql-tools-community]
name=MySQL Tools Community
#baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/7/$basearch/
baseurl=https://mirror.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
安装mysql-server(mysql-client等作为依赖自动被安装):
yum install mysql-community-server -y
修改datadir和socket(注:socket不修改会无法restart):
mkdir -p /data/mysql-data
cp -rf /var/lib/mysql /data/mysql-data
创建慢查询日志目录:
mkdir -p /data/mysql-data/log
vi /etc/my.cnf,修改:
[mysqld]
datadir=/data/mysql-data/mysql
socket=/data/mysql-data/mysql/mysql.sock
lower_case_table_names = 1
thread_cache_size=64
character_set_server=utf8mb4
max_connections=20000
max_connect_errors=200
join_buffer_size=4M
tmp_table_size=64M
max_allowed_packet=128M
read_rnd_buffer_size=8M
sort_buffer_size=4M
innodb_buffer_pool_size=1G
innodb_lru_scan_depth=800
innodb_log_buffer_size=32M
innodb_log_file_size=128M
expire_logs_days=7
slow_query_log=ON
slow_query_log_file=/data/mysql-data/log/mysql-slow.log
long_query_time=10
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
gtid_mode=ON
enforce_gtid_consistency=1
log_slave_updates=1
relay_log_recovery=1
#slave_skip_errors=ddl_exist_errors
slave_skip_errors=all
innodb_undo_log_truncate=1
default_authentication_plugin=mysql_native_password
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/data/mysql-data/mysql/mysql.sock
注:
1)在Mysql5.7之后,Mysql使用的是严格模式,sql_mode默认配置为:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2)slave-skip-errors的作用是定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。slave_skip_errors默认是off,也可设置为:
all、ddl_exist_errors(1007,1008,1050,1051,1054,1060,1061,1068,1091,1146[官方文档是1094,实测是1091])或具体Error_code(逗号分隔)。
修改权限(很重要!):
chown -R mysql:mysql /data/mysql-data/
设置开机自启并启动mysqld服务:
systemctl enable mysqld --now
启动完,确认一切正常之后,删除旧的数据目录:
rm -rf /var/lib/mysql
验证mysql状态:
systemctl status mysqld
ps -ef | grep mysql
查看临时密码(用于首次登录):
grep 'temporary password' /var/log/mysqld.log
分别登录:
mysql -uroot -p
修改root密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Th1s@is%Y0UR#pwd';
注:密码安全策略:长度>=8,包含大小写字母、特殊符号、数字。
创建用户并赋权(注:如果开启主从同步,在master上执行此操作可被同步到slave上):
CREATE USER 'main'@'%' IDENTIFIED WITH mysql_native_password BY 'Th1s@is%Y0UR#pwd';
GRANT ALL ON *.* TO 'main'@'%';
刷新权限:flush privileges;
查看mysql用户:
use mysql;
select Host,User,plugin from user;
查看版本:select version();
查看默认编码方式(可以不用修改):
SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation_%’;
注:数据库连接参数中,characterEncoding=utf8 会被自动识别为 utf8mb4,也可以不加这个参数,会自动检测。
而 autoReconnect=true 是必须加上的。
特别注意:
1)mysql.sock是mysql的主机和客户机在同一host上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快。
[mysqld]和[client]的socket都需要配置,且相同。
2)mysql8.0 要求我们不能在initialize之后再更改 lower_case_table_names 的值。也就是说,必须在初始化前就在my.cnf配置好“lower_case_table_names = 1”。如果没有在初始化之前就设置好“lower_case_table_names = 1”(表名一律按照小写),出路只有一条,卸载后重装mysql8。或者,严格区分大小写的表名。
3)mysql8+版更换了新的身份验证是(caching_sha2_password),之前身份验证是(mysql_native_password),Navicat和SQLyog等客户端软件其实是不支持新的身份验证,也就是说无法连接。如何解决?把登录密码加密规则改回(mysql_native_password)。
3. 构建MySQL主从同步
【主节点 mysql-m 上操作】
vim /etc/my.cnf,添加:
[mysqld]
server-id=176
log-bin=mysql-bin
重启服务:systemctl restart mysqld
【mysql-m、mysql-s节点上操作】
登录mysql:
create user 'repl'@'%' identified with mysql_native_password by 'R.ep.l@9966';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
【从节点 mysql-s 上操作】
vim /etc/my.cnf,添加:
server-id=177
重启服务:systemctl restart mysqld
注意:如果你是在virtualbox等软件中复制的虚拟机(auto.cnf文件中server-uuid相同),要执行 rm -f /data/mysql-data/mysql/auto.cnf,再 systemctl restart mysqld。
防止报错:Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.4
登录mysql:
配置关联的master:
change master to
master_host='mysql-m',
master_user='repl',
master_password='R.ep.l@9966',
master_port=3306,
MASTER_AUTO_POSITION = 1;
启用slave:
start slave;
show slave status \G
注:\G后不要带分号,否则会提示ERROR: No query specified
确认主从同步状态是否正常:
查看IO和SQL线程状态是否正常:(均为Yes即正常)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
~.~ 大功告成,皆OK王!
有没有一种可能:【皆OK王 · 官网】里的文章会在细节上把控得更好一丢丢…