下面是昨天进行了一次MySQL数据库迁移的步骤,也适合其他业务MySQL数据库的迁移,记录一下留作以后参考。
对于该迁移步骤有几点需要说明:
1.该迁移方法有几个必须满足的前提条件:原服务器和新服务器都有安装好并且正常可用的 MySQL 和 Percona Xtrabackup 软件环境;网络可以连通,或者可以进行文件传输;
2.实际迁移切换时,需要考虑一下原数据库的状态,或者在进行备份后,停止原数据库或设为只读模式;或者提前进行一次恢复,做成主从同步复制,在切换时,设主库为只读,关闭主从复制。关键是保证切换开始后,原数据库不能有新数据写入,造成数据不同步或丢失;
3.数据库启动、停止过程中都需要及时监控 error.log 日志,确认整个具体启停过程;同时要及时通过进程、端口、日志状态等确认数据库状态。
迁移先决条件确认
确认mysql软件环境:
安装mysql软件有多种方法,可以用RPM安装,编译安装,二进制安装等方法,比较简便的方法是将一个可以正常使用的MySQL软件目录打包,直接在新服务器中建mysql用户,上传,解压,改权限,添加命令目录即可;
mysql软件安装完成后,可以通过下面的命令确认是否运行正常(有版本返回结果,则正常):
# mysql -V
确认Percona Xtrabackup软件环境:
与mysql软件不同,Percona Xtrabackup软件有一些必须的运行依赖包,否则安装成功,也不能正常运行;
Percona Xtrabackup的依赖包有64个左右,单独安装这些RPM包,会有很多问题,所以服务器必须能够先连接公网,通过yum进行安装,整个安装过程如下:
# cd /usr/local
# tar xvf percona-xtrabackup-2.1.2-611.tar.gz
# vim /etc/profile.d/path.sh
两个重要迁移细节问题
文件传输方式:
进行数据库迁移时,数据库备份迁移是一个重要问题,如果迁移的数据库备份压缩后比较小,不消耗太长时间还比较好;
如果备份压缩后比较大,则需要考虑好备份文件传输和恢复的时间,文件传输如果新旧主机网络可以连通,则直接传输即可,如果不能直接连通,则需要先中转,然后在传送文件;
文件传输方式,如果文件比较小,需要CentOS 与Windows中转的话,使用 rz和 sz工具即可;
如果文件比较大,则需要考虑使用传统的ftp,sambar,scp等传统的Linux文件传输方式,或者使用 python -m SimpleHTTPServer + wget 的方式进行文件传输。
数据库迁移时状态:
数据迁移最核心的问题就是迁移过程中不能有数据丢失,或者迁移前后数据不一致的问题;
为了避免这个问题,就必须考虑好,迁移过程中原库和新库的状态切换,如果数据库业务交易量比较少,可以停机,数据库也比较小,则可以在迁移前,停止数据库,进行冷备份,传输文件到新数据库,进行恢复即可保证数据库状态的一致性;
如果数据库业务交易量比较少,几乎不可停机,数据库数据量非常大,则需要先保证元库与新库的网络畅通,用Xtrabackup软件在迁移之前的几小时进行一个全库备份,将备份文件传输到新库服务器,进行恢复;恢复后,以原库为master,新库为slave,搭建主从复制环境进行数据同步,到切换点,将原库锁住,设为只读模式,确认从库数据库同步完毕,关闭主库即可。
生产数据库迁移步骤
生成数据库迁移有很多方法,下面是经过自己多次使用和验证过的一种思路和调理比较清晰,数据安全性也有保证的一种方法。
原库所在服务器IP地址为: 10.0.1.100 ,迁移后新库所在服务器IP地址为: 192.168.2.200,整体迁移过程如下:
1.在 原库10.0.1.100 上进行数据库备份与下载
按照定时任务中命令进行备份:
# ssh 10.0.1.100
# /data/backup/mysql/day
# mv 20141105 20141105_old
# crontab -l
# /usr/local/bin/db_xtrabackup.sh day >> /data/backup/mysql/db_xtrabckup_cron.log
或者直接执行下面Xtrabackup的命令进行备份:
# innobackupex --defaults-file=/data/mysqldata/3306/my.cnf --user=xtrabk --password='onlybackup' /data/mysqldata/backup
打包备份,并下载到本地(10.0.1.100和192.168.2.200不通,无法直接传输)
# tar -zcvf db.tar.gz 20141105/*
# sz db.tar.gz
# sz /etc/my.cnf
原则上在迁移后,元数据库就不能有新的数据写入和变化,可以直接关闭数据库,或将数据库修改为只读模式:
# ps -ef|grep mysql
# service mysqld stop
# ps -ef|grep mysql
# tail -f /data/mysqldata/3307/error.log
或者修改为只读模式:
msyql> show global variables like "%read_only%";
mysql> flush tables with read lock; --持有一个全局锁定,保证数据不会有变化;解锁的命令是 unlock tables;
mysql> set global read_only=1 --将全局只读参数打开
msyql> show global variables like "%read_only%";
2.在192.168.2.200上进行介质上传
从本地上传数据库备份和my.cnf
# cd /data/mysql/
# rz dangpu_db.tar.gz
# tar -zxvf dagnpu_db.tar.gz
解压的文件夹路径为: /data/mysqldata/20141105/
# rz my.cnf
# cp my.cnf /etc/my.cnf
3.使用Xtrabackup进行数据恢复
执行两次日志应用
# innobackupex --defaults-file=/etc/my.cnf --apply-log /data/mysqldata/20141105
# innobackupex --defaults-file=/etc/my.cnf --apply-log /data/mysqldata/20141105
执行文件拷贝
# innobackupex --defaults-file=/etc/my.cnf --copy /data/mysqldata/20141105
4.启动恢复后的mysql数据库,确认连接
# chown -R mysql:mysql /data/mysql
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
# tail -f /usr/loca/3307/error.log
5.添加使用新IP地址连接数据库的用户授权
数据库进行上面的操作后,里面的各种表数据会与原库一致地迁移到新库中,其中的用户授权也一样,这就涉及一个问题:迁移前后除mysql服务器的IP外,其他服务器的IP地址是否会发生改变,如果不发生改变,则直接进行应用连接就可以了;
如果IP地址发生改变,则需要实现统计好,需要授权的用户IP地址、用户名、密码、对象、权限,编好脚本,在数据库迁移后,在新库中添加IP改变后的用户授权;
如在元数据库中,有一个test01用户从 10.0.1.157服务器上访问testdb库,迁移后应用服务器IP为192.168.2.257,用户名密码不变,则在原库查询权限为:
mysql> show grants for test01@'10.0.1.157';
+--------------------------------------------------------------------------------------------------------------+
| Grants for test01@10.0.1.157 |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test01'@'10.0.1.157' IDENTIFIED BY PASSWORD '*B40C1B5CFD47B4DBCE9615B724217C786AC5FDEA' |
| GRANT ALL PRIVILEGES ON `es`.* TO 'test01'@'10.0.1.157'
在新库迁移后,需要对该用户授权的命令为:
GRANT USAGE ON *.* TO 'test01'@'192.168.2.257' IDENTIFIED BY PASSWORD '*B40C1B5CFD47B4DBCE9615B724217C786AC5FDEA' |
GRANT ALL PRIVILEGES ON `es`.* TO 'test01'@'192.168.2.257'
6.应用确认数据库连接
最终业务应用连接迁移后的数据库,进行各种功能和性能测试。最终业务系统运行正常,则说明整个迁移过程正常结束。