您的位置:首页 > 数据库 > MySQL

一次mysql数据库迁移的过程记录

2014-11-06 10:43 489 查看
下面是昨天进行了一次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进行安装,整个安装过程如下:

1.安装编译所需的依赖包
#
yum install libaio libaio-devel perl-Time-HiRes curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* package -y

2.下载软件介质并解压缩

# cd /usr/local
# wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.2/binary/Linux/x86_64/percona-xtrabackup-2.1.2-611.tar.gz

# tar xvf percona-xtrabackup-2.1.2-611.tar.gz
# cd /percona-xtrabackup-2.1.2/bin/
# ll
# mv percona-xtrabackup-2.1.2 percona-xtrabackup

3.创建软件快捷命令执行方式
这个地方有两个思路,可以将mysql和Xtrabackup的软件命令目录拷贝或建立软连接到/usr/bin/目录,也可以将mysql和Xtrabackup软件命令目录添加到系统的path.sh文件中。
方式一:拷贝命令或建立软连接
将innobackupex、xtrabackup等文件copy到mysql程序目录下/bin、目录
# cd /usr/local/percona-xtrabackup/bin
# cp * /usr/local/mysql/bin/
将mysql安装目录下的文件做软链接到/usr/bin/目录下。这个比变量方便,这样就完成了部署安装!!!
ln -s /usr/local/mysql/bin/* /usr/bin/
方式二:添加软件命令目录

# vim /etc/profile.d/path.sh
在命令文件目录中加入软件命令目录的信息:
:/usr/local/mysql/bin/:/usr/local/percona-xtrabackup/bin
添加保存后,执行下面的命令使文件生效:
# source /etc/profile.d/path.sh

4.软件运行状态验证:
执行如下命令按 tab 键能够自动关联补全为安装成功!
# innobackupex --help
innobackupex innobackupex-1.5.1
# xtrabackup

两个重要迁移细节问题

文件传输方式:

进行数据库迁移时,数据库备份迁移是一个重要问题,如果迁移的数据库备份压缩后比较小,不消耗太长时间还比较好;

如果备份压缩后比较大,则需要考虑好备份文件传输和恢复的时间,文件传输如果新旧主机网络可以连通,则直接传输即可,如果不能直接连通,则需要先中转,然后在传送文件;

文件传输方式,如果文件比较小,需要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.应用确认数据库连接

最终业务应用连接迁移后的数据库,进行各种功能和性能测试。最终业务系统运行正常,则说明整个迁移过程正常结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: