不停止 MySQL 服务增加从库的两种方式

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介:
+关注继续查看

现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库。前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作。

一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁 表的时间也会很长。另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快,不锁表。为什么不锁表?因 为自身会监控主库日志,如果有更新的数据,就会先写到一个文件中,然后再回归到备份文件中,从而保持数据一致性。

服务器信息:

  • 主库:192.168.18.212(原有)

  • 从库1:192.168.18.213(原有)

  • 从库2:192.168.18.214(新增)

  • 数据库版本:MySQL5.5

  • 存储引擎:Innodb

  • 测试库名:weibo

一、mysqldump方式

MySQL主从是基于binlog日志,所以在安装好数据库后就要开启binlog。这样好处是,一方面可以用binlog恢复数据库,另一方面可以为主从做准备。

原有主库配置参数如下:


  1. # vi my.cnf 
  2. server-id = 1             #id要唯一 
  3. log-bin = mysql-bin         #开启binlog日志 
  4. auto-increment-increment = 1   #在Ubuntu系统中MySQL5.5以后已经默认是1 
  5. auto-increment-offset = 1 
  6. slave-skip-errors = all      #跳过主从复制出现的错误 

1. 主库创建同步账号


  1. mysql> grant all on *.* to 'sync'@'192.168.18.%' identified by 'sync'

2. 从库配置MySQL


  1. # vi my.cnf 
  2. server-id = 3             #这个设置3 
  3. log-bin = mysql-bin         #开启binlog日志 
  4. auto-increment-increment = 1   #这两个参数在Ubuntu系统中MySQL5.5以后都已经默认是1 
  5. auto-increment-offset = 1 
  6. slave-skip-errors = all      #跳过主从复制出现的错误 

3. 备份主库

# mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo > weibo.sql

参数说明:

  • –routines:导出存储过程和函数

  • –single_transaction:导出开始时设置事务隔离状态,并使用一致性快照开始事务,然后unlock tables;而lock-tables是锁住一张表不能写操作,直到dump完毕。

  • –master-data:默认等于1,将dump起始(change master to)binlog点和pos值写到结果中,等于2是将change master to写到结果中并注释。

4. 把备份库拷贝到从库


  1. # scp weibo.sql root@192.168.18.214:/home/root 

5. 在主库创建test_tb表,模拟数据库新增数据,weibo.sql是没有的


  1. mysql> create table test_tb(id int,name varchar(30)); 

6. 从库导入备份库


  1. # mysql -uroot -p123 -e 'create database weibo;' 
  2. # mysql -uroot -p123 weibo < weibo.sql 

7. 在备份文件weibo.sql查看binlog和pos值

# head -25 weibo.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;   #大概22行

8. 从库设置从这个日志点同步,并启动


  1. mysql> change master to master_host='192.168.18.212'
  2.     -> master_user='sync'
  3.     -> master_password='sync'
  4.     -> master_log_file='mysql-bin.000001'
  5.     -> master_log_pos=107
  6. mysql> start slave; 
  7.  
  8. mysql> show slave status\G; 
  9. ERROR 2006 (HY000): MySQL server has gone away 
  10. No connection. Trying to reconnect... 
  11. Connection id:    90 
  12. Current database: *** NONE *** 
  13. *************************** 1. row *************************** 
  14.                Slave_IO_State: Waiting for master to send event 
  15.                   Master_Host: 192.168.18.212 
  16.                   Master_User: sync 
  17.                   Master_Port: 3306 
  18.                 Connect_Retry: 60 
  19.               Master_Log_File: mysql-bin.000001 
  20.           Read_Master_Log_Pos: 358 
  21.                Relay_Log_File: mysqld-relay-bin.000003 
  22.                 Relay_Log_Pos: 504 
  23.         Relay_Master_Log_File: mysql-bin.000001 
  24.              Slave_IO_Running: Yes 
  25.             Slave_SQL_Running: Yes 
  26. ...... 

可以看到IO和SQL线程均为YES,说明主从配置成功。

9. 从库查看weibo库里面的表

mysql> show tables;
+---------------------------+
| Tables_in_weibo           |
+---------------------------+
| test_tb                   |

发现刚才模拟创建的test_tb表已经同步过来!

二、xtrabackup方式(推荐)

在上面配置基础上做实验,先删除掉从库配置:

mysql> stop slave;         #停止同步
mysql> reset slave;        #清除从连接信息
mysql> show slave status\G;   #再查看从状态,可以看到IO和SQL线程都为NO
mysql> drop database weibo;   #删除weibo库

此时,从库现在和新装的一样,继续前进!

1. 主库使用xtrabackup备份


  1. # innobackupex --user=root --password=123 ./ 

生成一个以时间为命名的备份目录:2015-07-01_16-49-43


  1. # ll 2015-07-01_16-49-43
  2. total 18480 
  3. drwxr-xr-x 5 root root     4096 Jul  1 16:49 ./ 
  4. drwx------ 4 root root     4096 Jul  1 16:49 ../ 
  5. -rw-r--r-- 1 root root      188 Jul  1 16:49 backup-my.cnf 
  6. -rw-r----- 1 root root 18874368 Jul  1 16:49 ibdata1 
  7. drwxr-xr-x 2 root root     4096 Jul  1 16:49 mysql/ 
  8. drwxr-xr-x 2 root root     4096 Jul  1 16:49 performance_schema/ 
  9. drwxr-xr-x 2 root root    12288 Jul  1 16:49 weibo/ 
  10. -rw-r--r-- 1 root root       21 Jul  1 16:49 xtrabackup_binlog_info 
  11. -rw-r----- 1 root root       89 Jul  1 16:49 xtrabackup_checkpoints 
  12. -rw-r--r-- 1 root root      563 Jul  1 16:49 xtrabackup_info 
  13. -rw-r----- 1 root root     2560 Jul  1 16:49 xtrabackup_logfile 

2. 把备份目录拷贝到从库上


  1. # scp -r 2015-07-01_16-49-43 root@192.168.18.214:/home/root 

3. 从库上把MySQL服务停掉,删除datadir目录,将备份目录重命名为datadir目录


  1. # sudo rm -rf /var/lib/mysql/ 
  2. # sudo mv 2015-07-01_16-49-43/ /var/lib/mysql 
  3. # sudo chown mysql.mysql -R /var/lib/mysql 
  4. # sudo /etc/init.d/mysql start 
  5. # ps -ef |grep mysql    #查看已经正常启动 
  6. mysql     8832     1  0 16:55 ?        00:00:00 /usr/sbin/mysqld 

4. 在主库创建test_tb2表,模拟数据库新增数据


  1. mysql> create table test_tb2(id int,name varchar(30)); 

5. 从备份目录中xtrabackup_info文件获取到binlog和pos位置


  1. # cat /var/lib/mysql/xtrabackup_info 
  2. uuid = 201af9db-1fce-11e5-96b0-525400e4239d 
  3. name = 
  4. tool_name = innobackupex 
  5. tool_command = --user=root --password=... ./ 
  6. tool_version = 1.5.1-xtrabackup 
  7. ibbackup_version = xtrabackup version 2.2.11 based on MySQL server 5.6.24 Linux (x86_64) (revision id: ) 
  8. server_version = 5.5.43-0ubuntu0.12.04.1-log 
  9. start_time = 2015-07-01 16:49:43 
  10. end_time = 2015-07-01 16:49:46 
  11. lock_time = 1 
  12. binlog_pos = filename 'mysql-bin.000001', position 429    #这个位置 
  13. innodb_from_lsn = 0 
  14. innodb_to_lsn = 1598188 
  15. partial = N 
  16. incremental = N 
  17. format = file 
  18. compact = N 
  19. compressed = N 

6. 从库设置从这个日志点同步,并启动


  1. mysql> change master to master_host='192.168.18.212'
  2.     -> master_user='sync'
  3.     -> master_password='sync'
  4.     -> master_log_file='mysql-bin.000001'
  5.     -> master_log_pos=429
  6. mysql> start slave; 
  7.  
  8. mysql> show slave status\G; 
  9. *************************** 1. row *************************** 
  10.                Slave_IO_State: Waiting for master to send event 
  11.                   Master_Host: 192.168.18.212 
  12.                   Master_User: sync 
  13.                   Master_Port: 3306 
  14.                 Connect_Retry: 60 
  15.               Master_Log_File: mysql-bin.000001 
  16.           Read_Master_Log_Pos: 539 
  17.                Relay_Log_File: mysqld-relay-bin.000002 
  18.                 Relay_Log_Pos: 363 
  19.         Relay_Master_Log_File: mysql-bin.000001 
  20.              Slave_IO_Running: Yes 
  21.             Slave_SQL_Running: Yes 
  22. ...... 

可以看到IO和SQL线程均为YES,说明主从配置成功。

9. 从库查看weibo库里面的表


  1. mysql> show tables; 
  2. +---------------------------+ 
  3. | Tables_in_weibo           | 
  4. +---------------------------+ 
  5. | test_tb                   | 

发现刚才模拟创建的test_tb2表已经同步过来。


来源:51CTO

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL 网络协议 关系型数据库
mysql主库更新后,从库都读到最新值了,主库还有可能读到旧值吗?
mysql主库更新后,从库都读到最新值了,主库还有可能读到旧值吗?
48 0
|
9月前
|
SQL 关系型数据库 MySQL
MySQL的主库将自己的Binlog日志按照一定的格式发送给从库,这个过程具体是怎样的?底层原理是什么?
MySQL的主库将自己的Binlog日志按照一定的格式发送给从库,这个过程具体是怎样的?底层原理是什么?
137 0
|
12月前
|
安全 关系型数据库 MySQL
因安全要求,需要修改mysql同步用户repl的密码。在主库修改完后,从库最佳修改同步用户密码的方式
因安全要求,需要修改mysql同步用户repl的密码。在主库修改完后,从库最佳修改同步用户密码的方式
432 0
|
关系型数据库 MySQL 数据库
MySQL读写分离从库配置:Slave_IO_Running: No 的解决
MySQL读写分离从库配置:Slave_IO_Running: No 的解决
118 0
MySQL读写分离从库配置:Slave_IO_Running: No 的解决
|
SQL 存储 监控
MySQL从库维护经验分享
MySQL 主从架构应该是最常用的一组架构了。从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用。其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维护经验,一起来学习吧。
138 0
|
监控 关系型数据库 MySQL
[MySQL FAQ]系列 — 大数据量时如何部署MySQL Replication从库
[MySQL FAQ]系列 — 大数据量时如何部署MySQL Replication从库
|
关系型数据库 MySQL 数据库
【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)(2)
【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)
62 0
【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)(2)
|
负载均衡 关系型数据库 MySQL
【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)(1)
【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)
88 0
【MySQL】使用docker配置主从复制(主库和从库都是全新的情况)(1)
|
监控 关系型数据库 MySQL
[MySQL FAQ]系列 — 大数据量时如何部署MySQL Replication从库
[MySQL FAQ]系列 — 大数据量时如何部署MySQL Replication从库
热门文章
最新文章
推荐文章
更多