前一阵迁移了线上服务器上的mysql的数据,数据量达到了亿级别。特在此记录一下操作流程。

现状:

目前线上使用了mysql主从库,即主库A和从库B,由于当初在安装过程中,mysql的数据目录并不是lvm(Logical Volume Manager)的,所以导致不能动态扩容,随着数据量的增大,A和B的数据以及日志 快要达到当前机器的存储极限了,使用df -h 查看硬盘空间仅剩10%了,为了处理这个问题,首先采取了治标的办法,即删除binlog日志,具体操作方法可以参考早前的一篇文章  mysql主从数据库的 binlog日志清理。这个方法很快的清理了日志,但是数据文件依旧很大,为了从根本上解决问题,所以需要迁移数据库来治本。

准备:

准备两台新机器,将每台机器的同一个目录配置成lvm(Logical Volume Manager),即可以动态扩容,然后分别安装mysql,(注意需要安装与AB两台同一个版本的mysql,其实可以安装高版本,但是绝对不能安装低版本),并且将mysql的数据目录指向为我们前面做的那个lvm的目录,然后将这两台机器mysql配置成主从关系,即新主库C和新从库D。这里面的一系列操作可以参考我前面的几篇文章:

  1. centos6下 mysql5.5的安装
  2. centos6下 mysql 5.5 数据目录迁移
  3. centos6 下mysql5.5 主从复制步骤

现在我们已经有了基础的环境,即线上正在使用的老主库A,老从库B以及新安装的文件系统为lvm的新主库C和新从库D。我们的目的是将数据迁移到C和D中,同时找准机会,停掉A和B,同时让应用程序连接到新的C和D。

特别提醒,在准备 工作中 B和C都需要有配置:

log_slave_updates = 1

,这个配置表示的是,如果从数据库 处于一个数据库复制链的中间的话,这个配置生效就会自动把前一个 数据库复制的内容传递到下一个数据库中。我们创建C库时要加上这样的配置,同时如果原有的B库没有需要新加,好在我们的B库有这个配置。

步骤:

(1)从B库导出线上业务数据库

由于线上主库A库,大量程序在使用,所以导出数据库的sql不能再A库执行,如果执行将对线上应用产生较大影响,所以在从库B库执行导出脚本操作,由于数据量大,需要准备nfs服务器来提供存储,因为最终导出的脚本大小接近了1个T。导出脚本如下:

mysqldump -uroot -ppassword --databases db1 db2 db3 --single-transaction --flush-logs --master-data=2 > /home/bak_all.sql

脚本 password为数据库密码,如果密码包含”!”,则需要转义,即写成”\!”。db1 db2 db3 为要导出的数据库,bak_all.sql为导出的sql脚本,需要注意的是/home/目录最好为nfs目录,由nfs文件服务器提供,然后在B和C上都挂载这个目录,这样的话,B导出后,C直接就可以用了。

还有一点需要提醒的是,这个导出命令和下面的导入命令执行时间很长,我自己实际操作 导出命令用了1天,导入命令用了3天。所以为了避免ssh远程连接突然中断带来的各种问题,推荐使用screen命令,具体 请参考 我前面的文章 linux执行耗时命令 screen 简单使用

mysqldump命令的各种参数详解会在以后的文章中介绍,不过需要注意的是,使用如上命令导出的sql脚本中包含了导出时锁表后,B的文件名和位置,C库同步B库时就要使用这两个值。

(2)将从B库导出的sql脚本导入到C库中

由于C和D已经在准备工作时配置了主从关系,所以将B库导出的sql脚本导入到C库后,D库自然也就有了数据。导入数据时,需要登录C库,登录成功后然后执行source命令,即可导入

mysql> source /home/bak_all.sql;

需要提醒的是,跟前面第一步一样,这里仍然需要挂在nfs文件服务器来存储bak_all.sql文件,因为这个文件很大,将近1T,此外也需要在 linux上使用screen。

(3)让C同步B

现在需要让C同步B即可,首先在B中建立一个账号repl用来给C同步使用,登陆B库,执行命令:


grant replication slave on *.* to 'repl'@'ipc' identified by 'password';
FLUSH PRIVILEGES;

,其中ipc为C库的IP地址,password为账号repl对应的密码。

然后登陆C库,执行命令

less /home/bak_all.sql

来查看C要同步B的日志名和位置,就在第一屏,如图:

clipboard

从上面看,日志文件名为 mysql-bin.001788  位置为107。这样就可以执行同步命令了,登陆C库,执行:


stop slave;
change master to master_host='ipb',master_user='repl',master_password='password',master_log_file='mysql-bin.001788',master_log_pos=107;
start slave;

ipb为B库的ip,repl和password为刚才创建的用来复制的账号和密码。

(4)观察四个数据库的情况

执行完 前面三个步骤后,就出现了这样一个数据库 复制链  A→B→C→D,这样A库的全部数据就能一直同步到B,C和D中,需要使用分别在B和C上使用

show slave status\G;

来观察数据同步的情况,一旦时机成熟,即四个数据库完全同步,我们就可以通知应用程序将数据库连接到C库上,同时我们会关闭C库同步B库的行为,而且会停掉A和B,以备万全。

(5)切换程序

连续观察四个数据库一周的情况,挑选凌晨 进行切换程序的操作,首先,需要确定四个 数据库已经完全同步,这个需要查看

show slave status\G;

里面 Seconds_Behind_Master 的值,当IO一切正常时,这个值为0表示实时同步没有延迟。具体可以参考   mysql主从复制 show slave status\G; 内容详解

当约定的凌晨时间到的时候,先通知应用程序全部停止,然后在A上使用命令

show full processlist;

来查看是否还有程序在连接A,当确定没有程序在连接A时,需要再次确定四个数据库是否已经完全同步。

完全同步后,最好记录一下当前四个数据库的show master status; 以及 show slave status\G;的情况。

然后需要在C上执行

stop slave;

,中断同步B的进程。然后通知应用程序更改数据库的配置文件重启即可。

(6)清除C库的从属信息

执行完上述操作后,继续观察一周新数据库的使用情况,如果一切顺利,就可以直接在C上清空B的master的信息,登陆C库,执行命令如下命令即可清除C作为B从库的一切信息


stop slave;
reset slave all;

linux 配置http代理以及epel源安装

在线上部署环境,安装软件时,经常碰到的一种情况就是使用yum来安装软件,但是有时无法访问外网,这时就需要正向代理的支持了。说到代理服务器,有正向代理,...

阅读全文

centos6下 mysql 5.5 数据目录迁移

前一篇文章 http://www.xiaomager.com/651.html 介绍了centos6下 mysql 5.5的安装过程。 当启动后,可以使用命令 ps -ef|grep mysql 看来mysql的进程情况,如...

阅读全文

centos6下 mysql5.5的安装

基础环境 操作系统:rethat6.4,64位系统,由于rethat和centos的孪生兄弟的关系,所以题目就写了centos,其实都一样。 mysql:具体版本为 5.5.46 准备工作 my...

阅读全文

4 条评论

欢迎留言