- 升级
1)升级的时候应该先升级replica
2)如果source使用的语句和依赖的行为在replica上不支持,即使replica已经升级成功也会导致复制出现问题
3)对5.7和8.0版本可以使用工具util.checkForServerUpgrade()来检查升级需要解决的一些问题,然后依个解决
a) MySQL Shell 8.0.20需要有all权限,从MySQL Shell 8.0.21开始需要有reload,process,select权限
b) mysqlsh> util.checkForServerUpgrade('user@example.com:3306', {"password":"password", "targetVersion":"8.0.27", "configPath":"/etc/my.cnf","outputFormat":"JSON"})
c) mysqlsh -- util checkForServerUpgrade user@localhost:3306 --target-version=8.0.27 --config-path=/etc/my.cnf --output-format=JSON
4)如果sql mode是STRICT_TRANS_TABLES或者STRICT_ALL_TABLES,可能会导致已经升级的replica发生复制失败
5)如果使用了binlog_format=STATEMENT,replica升级后可能导致语句能在source上source上执行成功,但是在replica上执行失败
a. 在source停止所有新的语句,等待replicas赶上之后进行升级replica
b. 如果不能停止新的语句,临时修改binlog_format=ROW,等待所有的replica处理完到该更改点为止的所有的binlog然后执行replica升级
6)8.0中默认字符集从latin1变成了utf8mb4,如果从5.7升级到8.0的时候,可以在配置文件中指定字符集为latin1
[mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci
7)标准升级步骤
a). 先升级replica,每个replica上执行下面的步骤
i. 做初步检查(参考《mysql升级前准备》
ii. 关闭mysql服务器
iii. 升级mysql的binaries或者packages
iv. 重启mysql服务器
v. 检查
① 如果升级到8.0.16之前的版本,使用mysql_upgrade更新系统表和架构,然后关掉服务器,并重启服务器(如果开启了gtid,不要开启二进制日志记录,不要使用--write-binlog选项)
②如果升级到8.0.16或者之后的版本,不用执行mysql_upgrade
vi. 使用start replica或者start slave启动复制
b). 所有的replica都升级完成之后,按照同样的步骤升级source
8)升级过程中有表repair或者rebuild(例如:collation改变需要表的索引rebuilt,可以分别在source和每个replica上执行这些操作)
a) 停掉所有的replicas,升级binaries和packages,使用启动参数--skip-slave-start或者skip_slave_start系统参数启动数据库,执行数据库对象的重建
b) 在source上Disable二进制日志,使用启动参数--skip-log-bin或者系统参数sql_log_bin=off启动数据库,执行对象重建,如果需要断开用户tcp/ip连接,使用skip_networking系统变量
c) 在source上re-enable二进制日志,去掉--skip-log-bin或者sql_log_bin=on,去掉skip_networking系统变量
d) 重启replicas,去掉--skip-slave-start或者skip_slave_start系统变量
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 降级