MySQL 5.7 主从部署及主从切换

MySQL 5.7 线下部署

主从安装mysql:
yum install https://home.vimll.com:9999/download/mysql/mysql57-community-release-el7-10.noarch.rpm
yum install mysql-community-server
本地文件安装
wget https://home.vimll.com:9999/download/mysql/mysql-57-42.zip
unzip mysql-57-42.zip
cd mysql-57-42;yum install * -y

cat > /etc/my.cnf << EOF
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client]
port = 3306
default-character-set = utf8mb4
[mysql]
port = 3306
default-character-set = utf8mb4

[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#datadir=/var/lib/mysql
datadir=/opt/mysql/data
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
lower_case_table_names=1

max_connections = 1000
max_connect_errors = 10000
max_user_connections   = 900
innodb_buffer_pool_size = 72G    # 视资源情更改。物理内存的一半即可

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id = 100
log_bin = mysql-bin
binlog_format = MIXED
#sync_binlog = 1
expire_logs_days = 30

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone='+08:00'
default_storage_engine=InnoDB

slow_query_log = ON
slow_query_log_file = /opt/mysql/data/localhost-slow.log
long_query_time = 1

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#主从同步配置
#binlog-do-db = test        #要同步的数据库 
#binlog-ignore-db = mysql   #不需要同步的数据库 
#binlog_ignore_db = information_schema
#binlog_ignore_db = performation_schema
#binlog_ignore_db = sys

[mysqldump]
quick
max_allowed_packet = 128M
user=dumper
password=Dumper@123

EOF

cat /var/log/mysqld.log |grep pass
mysql -uroot -p
alter user 'root'@'localhost' identified by 'xxxxx';

create database buswash;
create user buswash@'%' identified by 'xxxxxx';
GRANT  all privileges  ON buswash.* TO `buswash`@`%` ;

create database test;
create user test@'%' identified by 'Test123';
GRANT  all privileges  ON test.* TO `test`@`%` ;

0 2 * * * mysqldump  --databases buswash |gzip > /backup/mysql-backups/buswash_`date +\%F`.sql.gz
0 4 * * * find /backup/mysql-backups/ -type f -mtime +15  |xargs rm -f

#主从配置
主库创建同步用户:
CREATE USER 'slave'@'%' IDENTIFIED BY 'Slave@123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

log_bin是否开启
mysql> show variables like 'log_bin';

从库配置差异点:
cat /etc/my.cnf
......
server-id = 210             #必须唯一
log_bin = mysql-bin         #开启及设置二进制日志文件名称
binlog_format = MIXED
sync_binlog = 1
expire_logs_days =7         #二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
log_slave_updates = 1       #【关键点】从主服务器接收到的更新同时要写入二进制日志
......
登录从库:
stop slave;
CHANGE MASTER TO 
MASTER_HOST='192.168.9.20',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='Slave123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
start slave;
stop slave; //停止同步
start slave; //开始同步

//【关键处】从主库的该log_bin文件开始读取同步信息,主库show master status返回结果
MASTER_LOG_FILE='mysql-bin.000001',
//【关键处】从文件中指定位置开始读取,主库show master status返回结果
MASTER_LOG_POS=154;

查看同步状态:
show slave status \G
Slave_IO_Running和Slave_SQL_Running都是Yes,则同步是正常的。

正常主从切换:
为了在切换时不会漏掉数据库的更新,必须将主数据库停掉,设为只读:set global read_only=1;调整完后 set global read_only=0;
主库暂停后从库检查 确保从服务器已经处理了日志中的所有语句
STOP SLAVE IO_THREAD;
SHOW PROCESSLIST;
 Has read all relaylogwaiting for the slave I/O thread to update it

从库暂停同步     
STOP SLAVE;
RESET MASTER;
RESET SLAVE;
重启
创建同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Show master status \G;

原主库 RESET MASTER;并接入新主库同步
stop slave;
CHANGE MASTER TO 
MASTER_HOST='192.168.9.20',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
start slave;

show slave status \G;
Show master status \G;

主库宕机切换:
--查询从库状态
show slave status\G
--查询主库状态
show slave hosts;
--从库: 停止 IO_THREAD 线程
stop slave IO_THREAD;
show slave status\G
SHOW PROCESSLIST;
 Has read all relaylogwaiting for the slave I/O thread to update it
--激活从库(从库上操作)
stop slave;
reset master;
reset slave all;
show binary logs;
备注:reset slave all 命令会删除从库的 replication 参数,之后 show slave status\G 的信息返回为空。
Show master status \G;
--将原来主库变为从库
stop slave;
CHANGE MASTER TO 
MASTER_HOST='192.168.9.20',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
start slave;