升级mysql 5.5.19至5.6.33(架构:mysql双主复制+keepalive)

一:实验环境

操作系统:CentOS release 6.5 (Final)

mysql双主复制+keepalive实现了高可用:

master1:10.192.203.201

master2:10.192.203.202

vip 10.192.203.203

虚拟ip当前在master1上。程序写入的是vip。

 

二:实验步骤


2.1 升级master2


2.1.1 备份master2

show databases;查看下都有哪些库

mysqldump --single-transaction -u root -p-A > /download/bak/all.bak_20161125

检查备份文件,确保无误。

2.1.2 记录binlog位置

#在master1上加个读锁, 记录master1此刻写入的 File和Position:

flush tables with read lock; #锁定master1,不允许写入

show master status ;

#停止master2的slave:

stop slave;

show slave status \G; #记录读取和执行的binlog位置

#在master1上unlock tables;

 

之所以进行如上步骤,是为了升级完成master2,导入备份的数据后,知道应该从哪个位置开始复制,从而和master1保持一致。

2.1.3 卸载master2

卸载脚本内容如:

[plain]  view plain  copy
  1. mysqldir='/data/mysql'  
  2. basedir='/usr/local/mysql'  
  3. cnf=/etc/my.cnf  
  4. password='123456'  
  5.    
  6. #1:关闭数据库  
  7. mysqladmin -u root -p$password shutdown  
  8. killall -u mysql  
  9.    
  10. #2:删除用户和组  
  11. userdel mysql  
  12. groupdel mysql  
  13.    
  14. #3:删除目录  
  15. rm -rf $mysqldir  
  16. rm -rf $basedir  
  17.    
  18. #4:取消开机自动启动  
  19. rm -rf /etc/rc.d/init.d/mysql  
  20. chkconfig --del mysql  
  21.    
  22. #5:删除 PATH  
  23. #root用户  
  24. sed -i'/^PATH=/s/:\/usr\/local\/mysql\/bin//' /root/.bash_profile  
  25. source /root/.bash_profile  
  26. #mysql用户  
  27. sed -i'/^PATH=/s/:\/usr\/local\/mysql\/bin//' /home/mysql/.bash_profile  
  28. source /home/mysql/.bash_profile  
  29.    
  30. #6:取消防火墙端口  
  31. #修改文件/etc/sysconfig/iptables  
  32. #删除-A INPUT -m state--state NEW -m tcp -p tcp --dport 3306 -j ACCEPT  
  33. sed -i '/-A INPUT -m state --state NEW -mtcp -p tcp --dport 3306 -j ACCEPT/d' /etc/sysconfig/iptables  
  34.    
  35. service iptables restart  

2.1.4 安装5.6.33版本mysql

2.1.4.1 安装脚本内容

[plain]  view plain  copy
  1. #记得先将mysql安装包上传至$dir目录下  
  2. #配置文件my.cnf上传master2-sample-my.cnf,并根据实际情况修改下innodb_buffer_pool_size取值,记得根据实际的安装目录修改log-bin,relay-log,relay-log-index,log-bin取值  
  3. #注意,mysqldir假如不是/data/mysql,要改成其他目录(如/database/mysql)的话,需要修改该脚本中这一行sed  -i'47s/datadir=/datadir=\/database\/mysql/g' /etc/rc.d/init.d/mysqld  
  4.    
  5. #定义目录  
  6. basedir='/usr/local/mysql'  
  7.         
  8. mysqldir='/data/mysql'   
  9.         
  10. datadir=$mysqldir  
  11.  #binlogdir=$mysqldir/binlog  
  12.       
  13. cnf=/etc/my.cnf  
  14.    
  15. dir='/download/'  
  16.    
  17. socket='/tmp/mysql.sock'  
  18.    
  19. port='3306'  
  20.    
  21. filename='mysql-5.6.33-linux-glibc2.5-x86_64'  
  22.    
  23. password='123456'  
  24.    
  25. password2=\'$password\'  
  26.    
  27. date=`date "+%y%m%d"`  
  28.    
  29. #修改配置文件  
  30. mv /etc/my.cnf /etc/my.cnf_bak_$date  
  31. mv $dir'master2-sample-my.cnf' /etc/my.cnf  
  32.    
  33. #建用户  
  34. groupadd mysql  
  35. useradd -g mysql mysql  
  36.         
  37. #安装依赖包  
  38. yum install libaio -y  
  39.        
  40. #解压  
  41. cd $dir   
  42. if ( test -s $filename )  
  43. then  
  44.    echo '已经解压过,无需重复解压'  
  45. else  
  46.    tar -xvf $filename.tar.gz  
  47. fi       
  48.    
  49.  #拷贝解压后的mysql目录到系统的本地软件目录:  
  50. cp $filename $basedir -r  
  51.    
  52. #新建目录  
  53. #mkdir -p $datadir  
  54. #mkdir -p $binlogdir  
  55. mkdir -p $mysqldir  
  56. chown -R mysql:mysql $basedir  
  57. chown -R mysql:mysql $mysqldir  
  58.    
  59. #建立基本库  
  60. $basedir/scripts/mysql_install_db--defaults-file=$cnf --user=mysql --basedir=$basedir --datadir=$datadir  
  61. #设置开机自动启动  
  62. cp $basedir'/support-files/mysql.server''/etc/rc.d/init.d/mysqld'  
  63. #修改该文件datadir  
  64. #已经知道datadir=在第47行  
  65. sed -i '47s/datadir=/datadir=\/data\/mysql/g' /etc/rc.d/init.d/mysqld  
  66.    
  67. chmod +x /etc/rc.d/init.d/mysqld  
  68.    
  69. chkconfig --add mysqld  
  70.    
  71. chkconfig mysqld on  
  72.    
  73. #配置PATH  
  74. #root用户  
  75. sed -i'/^PATH=/s/$/:\/usr\/local\/mysql\/bin/' /root/.bash_profile  
  76. source /root/.bash_profile  
  77.    
  78. #mysql用户  
  79. sed -i '/^PATH=/s/$/:\/usr\/local\/mysql\/bin/'/home/mysql/.bash_profile  
  80. source /home/mysql/.bash_profile  
  81. #启动数据库  
  82.    
  83. service mysqld start  
  84.    
  85. #开放防火墙端口  
  86. #开放3306端口,插入到这一行-AINPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT后面  
  87. sed -i '/-A INPUT -m state --state NEW -mtcp -p tcp --dport 22 -j ACCEPT/s/$/\n-A INPUT -m state --state NEW -m tcp -ptcp --dport 3306 -j ACCEPT/' /etc/sysconfig/iptables  
  88.    
  89. service iptables restart  
  90. #公司的防火墙是关闭的,所以这里就不开放端口了。  
  91.    
  92. #修改mysql root 密码  
  93. #根据执行该脚本最后输出的信息('建立基本库'中的root密码)来修改,改成$password,需要交互执行  
  94. #mysql 5.6.33默认密码为空  
  95. mysqladmin -u root  password $password  
  96.    
  97.    
  98. #待新建一个用于远程访问的用户,密码和本地用户一致。  
  99. $basedir/bin/mysql -u root -p$password -e"grant all privileges on *.* to 'root'@'%' identified by  $password2"  

2.1.4.2 配置文件master2-sample-my.cnf内容

由于是从5.5版本升级至5.6版本,为了避免低版本从库复制高版本主库时发生错误:

[plain]  view plain  copy
  1. Got fatal error 1236 from master when reading data from binary log: 'Slave can not handle replication events with the checksum that master is configured to log;   

需要确保在配置文件中添加参数:binlog_checksum=none

 master2-sample-my.cnf文件内容:

[plain]  view plain  copy
  1. [client]  
  2. port           =3306  
  3. socket                =/tmp/mysql.sock  
  4. [mysqld]  
  5. port           =3306  
  6. socket                =/tmp/mysql.sock  
  7. binlog_checksum=none  
  8. innodb_buffer_pool_size = 请设置成合适的值G  
  9. server-id = 2  
  10. max_connections = 5000  
  11. max_connect_errors = 300  
  12. max_allowed_packet = 64M  
  13. binlog_format=row  
  14. slow_query_log  
  15. long_query_time = 2  
  16. sync_binlog=1  
  17. innodb_support_xa=1  
  18. innodb_file_per_table=1  
  19. replicate-ignore-db = mysql  
  20. replicate-ignore-db = information_schema  
  21. relay-log=/data/mysql/master2-relay-bin  
  22. relay-log-index=/data/mysql/master2-relay-bin.index  
  23. log-bin=/data/mysql/master2-mysql-bin  
  24. log_slave_updates  
  25. [mysqldump]  
  26. # Do not buffer the whole result set inmemory before writing it to  
  27. # file. Required for dumping very largetables  
  28. quick  
  29.    
  30. max_allowed_packet = 64M  
  31.    
  32. [mysql]  
  33. no-auto-rehash  
  34.    
  35. # Only allow UPDATEs and DELETEs that usekeys.  
  36. #safe-updates  
  37.    
  38. [myisamchk]  
  39. key_buffer_size = 512M  
  40. sort_buffer_size = 512M  
  41. read_buffer = 8M  
  42. write_buffer = 8M  
  43.    
  44. [mysqlhotcopy]  
  45. interactive-timeout  
  46.    
  47. [mysqld_safe]  
  48. open-files-limit = 8192  

2.1.5 恢复数据

导入备份的数据

mysql -u root -p < all.bak_20161125

2.1.6 制造测试数据

在master1上插入几条测试数据

[sql]  view plain  copy
  1. mysql> use sds;  
  2. Database changed  
  3. mysql> show tables;  
  4. Empty set (0.00 sec)  
  5.    
  6. mysql> create table t(id int);  
  7. Query OK, 0 rows affected (0.06 sec)  
  8.    
  9. mysql> insert into t(id)values(1),(2),(3);  
  10. Query OK, 3 rows affected (0.02 sec)  
  11. Records: 3 Duplicates: 0  Warnings: 0  
  12.    
  13. mysql> select  * from t;  
  14. +------+  
  15. | id  |  
  16. +------+  
  17. |   1 |  
  18. |   2 |  
  19. |   3 |  
  20. +------+  
  21. rows in set (0.02 sec)  

2.1.7 将master2指向master1

master_log_file ,master_log_pos需要和2.1.2步骤中showmaster status ;的结果保持一致:

[sql]  view plain  copy
  1. change master tomaster_log_file='mysql-bin.000003',master_log_pos=1109,master_host='10.192.203.201',master_user='RepUser',master_password='beijing',master_port=3306;  
  2. mysql> start slave;  
  3. Query OK, 0 rows affected (0.03 sec)  
  4.    
  5. show slave status \G;检查下Slave_IO_Running,Slave_SQL_Running是否都为Yes。  
  6.    
  7. #验证下是否将差异数据同步了过来  
  8. mysql> use sds;  
  9. Database changed  
  10. mysql> show tables;  
  11. +---------------+  
  12. | Tables_in_sds |  
  13. +---------------+  
  14. | t             |  
  15. +---------------+  
  16. 1 row in set (0.00 sec)  
  17.    
  18. mysql> select * from t;  
  19. +------+  
  20. | id  |  
  21. +------+  
  22. |   1 |  
  23. |   2 |  
  24. |   3 |  
  25. +------+  
  26. rows in set (0.01 sec)  

说明master2同步成功。

2.2 升级master1


2.2.1 漂移vip到master2机器

由于我在自己机器上配置了监控mysql定时任务(每分钟监控一次mysql状态,如果mysql宕机,将该机器上的heartbeat进程杀掉),因此升级master2,肯定会导致heartbeat被关闭。因此需要先启动master2的heartbeat进程:

service heartbeat start

#关闭master1进程:

service heartbeat stop

#在maser2上使用ip addr命令验证虚拟IP是否漂移成功。

[plain]  view plain  copy
  1. [root@slave2 download]# ip addr  
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu16436 qdisc noqueue state UNKNOWN  
  3.    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
  4.    inet 127.0.0.1/8 scope host lo  
  5.    inet6 ::1/128 scope host  
  6.       valid_lft forever preferred_lft forever  
  7. 2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000  
  8.    link/ether 08:00:27:04:05:16 brd ff:ff:ff:ff:ff:ff  
  9.    inet 10.192.203.202/24 brd 10.192.203.255 scope global eth0  
  10.    inet 10.192.203.203/24 brd 10.192.203.255 scope global secondary eth0  
  11.    inet6 fe80::a00:27ff:fe04:516/64 scope link  
  12.       valid_lft forever preferred_lft forever  
  13. 3: eth1:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000  
  14.    link/ether 08:00:27:3a:ec:3c brd ff:ff:ff:ff:ff:ff  
  15.    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth1  
  16.    inet6 fe80::a00:27ff:fe3a:ec3c/64 scope link  
  17.       valid_lft forever preferred_lft forever  

看到了vip:10.192.203.203,说明漂移成功。

2.2.2 备份master1

2.2.3 记录binlog位置

逻辑步骤请参考2.1.2。

2.2.4 卸载master1

卸载脚本内容同“2.1.3 卸载master2”一样。

2.2.5 安装5.6.33版本mysql


2.2.5.1 安装脚本内容

注意:和安装master2脚本只有一个地方不同:

mv $dir'master2-sample-my.cnf' /etc/my.cnf

mv $dir'master1-sample-my.cnf' /etc/my.cnf

 

--以下是安装脚本内容:

[plain]  view plain  copy
  1. #记得先将mysql安装包上传至$dir目录下  
  2. #配置文件my.cnf上传master1-sample-my.cnf,并根据实际情况修改下innodb_buffer_pool_size取值,记得根据实际的安装目录修改log-bin,relay-log,relay-log-index,log-bin取值  
  3. #注意,mysqldir假如不是/data/mysql,要改成其他目录(如/database/mysql)的话,需要修改该脚本中这一行sed  -i'47s/datadir=/datadir=\/database\/mysql/g' /etc/rc.d/init.d/mysqld  
  4.    
  5. #定义目录  
  6. basedir='/usr/local/mysql'  
  7.         
  8. mysqldir='/data/mysql'   
  9.          
  10. datadir=$mysqldir  
  11.  #binlogdir=$mysqldir/binlog  
  12.       
  13. cnf=/etc/my.cnf  
  14.    
  15. dir='/download/'  
  16.    
  17. socket='/tmp/mysql.sock'  
  18.    
  19. port='3306'  
  20.    
  21. filename='mysql-5.6.33-linux-glibc2.5-x86_64'  
  22.    
  23. password='123456'  
  24.    
  25. password2=\'$password\'  
  26.    
  27. date=`date "+%y%m%d"`  
  28.    
  29. #修改配置文件  
  30. mv /etc/my.cnf /etc/my.cnf_bak_$date  
  31. mv $dir'master1-sample-my.cnf' /etc/my.cnf  
  32.    
  33. #建用户  
  34. groupadd mysql  
  35. useradd -g mysql mysql  
  36.         
  37. #安装依赖包  
  38. yum install libaio -y  
  39.        
  40. #解压  
  41. cd $dir   
  42. if ( test -s $filename )  
  43. then  
  44.    echo '已经解压过,无需重复解压'  
  45. else  
  46.    tar -xvf $filename.tar.gz  
  47. fi       
  48.    
  49.  #拷贝解压后的mysql目录到系统的本地软件目录:  
  50. cp $filename $basedir -r  
  51.    
  52. #新建目录  
  53. #mkdir -p $datadir  
  54. #mkdir -p $binlogdir  
  55. mkdir -p $mysqldir  
  56. chown -R mysql:mysql $basedir  
  57. chown -R mysql:mysql $mysqldir  
  58.    
  59. #建立基本库  
  60. $basedir/scripts/mysql_install_db--defaults-file=$cnf --user=mysql --basedir=$basedir --datadir=$datadir  
  61. #设置开机自动启动  
  62. cp $basedir'/support-files/mysql.server''/etc/rc.d/init.d/mysqld'  
  63. #修改该文件datadir  
  64. #已经知道datadir=在第47行  
  65. sed -i '47s/datadir=/datadir=\/data\/mysql/g' /etc/rc.d/init.d/mysqld  
  66.    
  67. chmod +x /etc/rc.d/init.d/mysqld  
  68.    
  69. chkconfig --add mysqld  
  70.    
  71. chkconfig mysqld on  
  72.    
  73. #配置PATH  
  74. #root用户  
  75. sed -i'/^PATH=/s/$/:\/usr\/local\/mysql\/bin/' /root/.bash_profile  
  76. source /root/.bash_profile  
  77.    
  78. #mysql用户  
  79. sed -i'/^PATH=/s/$/:\/usr\/local\/mysql\/bin/' /home/mysql/.bash_profile  
  80. source /home/mysql/.bash_profile  
  81. #启动数据库  
  82.    
  83. service mysqld start  
  84.    
  85. #开放防火墙端口  
  86. #开放3306端口,插入到这一行-AINPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT后面  
  87. sed -i '/-A INPUT -m state --state NEW -mtcp -p tcp --dport 22 -j ACCEPT/s/$/\n-A INPUT -m state --state NEW -m tcp -ptcp --dport 3306 -j ACCEPT/' /etc/sysconfig/iptables  
  88.    
  89. service iptables restart  
  90. #公司的防火墙是关闭的,所以这里就不开放端口了。  
  91.    
  92. #修改mysql root 密码  
  93. #根据执行该脚本最后输出的信息('建立基本库'中的root密码)来修改,改成$password,需要交互执行  
  94. #mysql 5.6.33默认密码为空  
  95. mysqladmin -u root  password $password  
  96.    
  97.    
  98. #待新建一个用于远程访问的用户,密码和本地用户一致。  
  99. $basedir/bin/mysql -u root -p$password -e"grant all privileges on *.* to 'root'@'%' identified by  $password2"  


2.2.5.2 配置文件master1-sample-my.cnf内容

#master1-sample-my.cnf与master2-sample-my.cnf配置文件内容只有几个地方不同:

server-id ,relay-log,relay-log-index

 配置文件内容:

[plain]  view plain  copy
  1. [client]  
  2. port           =3306  
  3. socket                =/tmp/mysql.sock  
  4. [mysqld]  
  5. port           =3306  
  6. socket                =/tmp/mysql.sock  
  7. binlog_checksum=none  
  8. innodb_buffer_pool_size = 请设置成合适的值G  
  9. server-id = 1  
  10. max_connections = 5000  
  11. max_connect_errors = 300  
  12. max_allowed_packet = 64M  
  13. binlog_format=row  
  14. slow_query_log  
  15. long_query_time = 2  
  16. sync_binlog=1  
  17. innodb_support_xa=1  
  18. innodb_file_per_table=1  
  19. replicate-ignore-db = mysql  
  20. replicate-ignore-db = information_schema  
  21. relay-log=/data/mysql/master1-relay-bin  
  22. relay-log-index=/data/mysql/master1-relay-bin.index  
  23. log-bin=/data/mysql/master1-mysql-bin  
  24. log_slave_updates  
  25. [mysqldump]  
  26. # Do not buffer the whole result set inmemory before writing it to  
  27. # file. Required for dumping very largetables  
  28. quick  
  29.    
  30. max_allowed_packet = 64M  
  31.    
  32. [mysql]  
  33. no-auto-rehash  
  34.    
  35. # Only allow UPDATEs and DELETEs that usekeys.  
  36. #safe-updates  
  37.    
  38. [myisamchk]  
  39. key_buffer_size = 512M  
  40. sort_buffer_size = 512M  
  41. read_buffer = 8M  
  42. write_buffer = 8M  
  43.    
  44. [mysqlhotcopy]  
  45. interactive-timeout  
  46.    
  47. [mysqld_safe]  
  48. open-files-limit = 8192  

 

2.2.6 恢复数据

导入备份的数据

mysql -u root -p < all.bak_20161125

2.2.7 制造测试数据

2.2.8 将master1指向master2

思路和“2.1.7 将master2指向master1”一样。

[sql]  view plain  copy
  1. change master tomaster_log_file='master2-mysql-bin.000003' ,master_log_pos=489108,master_host='10.192.203.202',master_user='RepUser',master_password='beijing',master_port=3306;  
  2.  mysql> start slave;  
  3. Query OK, 0 rows affected (0.03 sec)  

 最后检查下master1,master2上的从库是否都正常。

发现master2上的slave报错:

Last_IO_Error: error connecting to master'RepUser@10.192.203.201:3306' - retry-time: 60 retries: 33

 我手动在master1上重建了下复制用户,然后stop slave;start slave;没有再报这个错误。

也不知道为什么会报这个错误。备份文件里明明也能看到这个复制用户的插入记录呀。

 

start slave时又报了一个新的错误:

Last_IO_Error: Got fatal error 1236 frommaster when reading data from binary log: 'Could not find first log file namein binary log index file'

在master1上flush logs;

show master status;

在master2上重新指定binlog位置,开始复制即可。

 

2.3 修改参数binlog_checksum

起初,安装mysql 5.6.33的时候,特意将binlog_checksum设置为none,原因请参考:http://blog.csdn.net/yabingshi_tech/article/details/53319904

 

现在master1,master2版本都变成了5.6.33了。因此现在需要注释掉配置文件里的binlog_checksum=none,然后重启mysql即可。这里也顺便将vip切换回master1。

master1:

注释掉配置文件里的binlog_checksum=none,然后重启mysql;

启动master1的heartbeat;

 

master2:

注释掉配置文件里的binlog_checksum=none,然后重启mysql;

重启master2的heartbeat;

 

在master1上执行ip addr命令验证是否vip漂移成功。

 

检查该参数是否修改成功:

mysql> show variables like '%checksum%';

+---------------------------+--------+

| Variable_name             | Value  |

+---------------------------+--------+

| binlog_checksum           | CRC32  |

| innodb_checksum_algorithm | innodb |

| innodb_checksums          | ON     |

| master_verify_checksum    | OFF   |

| slave_sql_verify_checksum | ON     |

+---------------------------+--------+

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值