MySQL数据库迁移详细步骤(转)

==========================================================================================

一、背景简介

==========================================================================================

1、问题描述

由于机房搬迁,需要对后台DB服务器进行迁移,同时为了保证在数据迁移过程中,对线上业务不造成影响,并能够做到秒级切换。如果我们采用普通的逻辑备份,比如:mysqldump,会存在锁表的情况,显然不可取。因此我们采取基于物理备份的方案,备份工具选型为:xtrabackup。

2、系统环境


IP地址


系统版本


MySQL版本


角色


172.17.138.239


SUSE Linux Enterprise Server 10 (x86_64)


5.0.26


旧环境(临时主)


10.217.121.196


CentOS 6.3 (x86_64)


5.0.27


新环境(主)


10.217.121.216


CentOS 6.3 (x86_64)


5.0.27


新环境(从)

(1)、由于当前的mysql版本太旧,故备份工具推荐选择xtrabackup-2.0.8的版本;

(2)、由于当前的系统环境太旧,官方提供的xtrabackup二进制版本无法运行,故需进行源码编译。

3、编译要求

(1)、需要安装cmake依赖库;

(2)、需要下载一份mysql-5.1.59的源码包,放在percona-xtrabackup-2.0.8目录下;

(3)、libtool的版本不能高于2.4。

==========================================================================================

二、xtrabackup编译安装

==========================================================================================

1、编译安装cmake

http://wwwNaNake.org/files/v2.8/cmake-2.8.10.tar.gz

# tar -xvzf cmake-2.8.10.tar.gz

# cd cmake-2.8.10

# ./bootstrap --prefix=/usr/local

# gmake --jobs=`grep processor/proc/cpuinfo | wc -l`

# gmake install

2、编译安装xtrabackup

http://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz

# tar xvzf percona-xtrabackup-2.0.8.tar.gz

# cd percona-xtrabackup-2.0.8

## 将mysql-5.1.59源码包下载到percona-xtrabackup-2.0.8目录下,无需解压

http://downloads.mysql.com/archives/get/file/mysql-5.1.59.tar.gz

# ./utils/build.sh innodb50

注意:

以上标注部分,需要与当前的MySQL主版本对应上,如果有不明白的,可以参考以下信息。

# cat BUILD.txt

# vim ./utils/build.sh

# cp innobackupex /usr/local/bin/

# cd src

# cp xbstream xtrabackup_51 /usr/local/bin/

# cd /usr/local/bin/

# ln -s innobackupex innobackupex-1.5.1

# ln -s xtrabackup_51 xtrabackup

==========================================================================================

三、DB数据备份

==========================================================================================

1、一些常用用法

## 如果在从端运行的话

innobackupex --user=root --defaults-file=/etc/my.cnf --slave-info --no-timestamp /data/mysql_backup

## 如果在主端运行的话

innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup

## 如果在主端运行并压缩传输到远程服务器的话

innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp --stream=tar /data/mysql_backup | gzip | ssh [email protected]" cat - > /data/mysql_backup.tgz"

注意:

我们本次的备份,直接在主DB(172.17.138.239)上进行,因为xtrabackup不会锁表,对业务不造成影响,也会为后续的主从关系建立带来便利。

2、备份步骤

由于本地服务器的磁盘空间所剩不多,所以本次备份采用压缩传输到远程服务器的方式。但为了更好地描述在本次备份中遇到的问题,我们先采用本地模式。

# innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup

注意:

如上报错信息,主要是因为“/etc/my.cnf”配置文件里没有指定basedir、datadir参数设置,导致xtrabackup找不到。

# ps aux | grep mysql[d]

注意:

根据以上信息,我们需要将以下参数添加到配置文件中(/etc/my.cnf):

basedir=/usr/local/services/mysql-5.0.26

datadir=/usr/local/services/mysql-5.0.26/var

# innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup

注意:

出现这种错误信息,是因为备份目录“/data/mysql_backup”已经存在,主要是由前一次操作引起的。因为xtrabackup要求备份目录事先不能存在,需要在执行时才会自动创建。

如果我们将数据备份到本地的话(前提是服务器磁盘空间足够多),执行以下命令即可:

# rm -rf /data/mysql_backup

# innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp /data/mysql_backup

在恢复的时候,将本地的备份数据rsync同步到远程服务器,然后采用xtrabackup进行恢复即可。

但考虑到本地磁盘空间不足,故本次数据迁移,我们采用压缩传输到远程服务器的备份方式(此种方法比较慢^_^),执行以下命令即可:

innobackupex --user=root --defaults-file=/etc/my.cnf --no-timestamp --stream=tar /data/mysql_backup | gzip | ssh [email protected] "cat - > /data/mysql_backup.tgz"

## 本地服务器上的备份信息输出

## 远程服务器上的文件信息

注意:

以上数据备份时间可能会比较长,推荐放在深夜进行,第二天来恢复 ^_^

==========================================================================================

四、DB数据恢复

==========================================================================================

1、安装mysql-5.0.27环境

http://cdn.mysql.com/archives/mysql-5.0/mysql-5.0.27.tar.gz

# /usr/sbin/groupadd mysql

# /usr/sbin/useradd mysql -g mysql -s /sbin/nologin

# mkdir -p /data/dbdata/{data,binlog,relaylog,otherlog} /var/run/mysql

# chown -R mysql:mysql /data/dbdata /var/run/mysql

# cd /usr/local/src

# tar xvzf mysql-5.0.27.tar.gz

# cd mysql-5.0.27

# ./configure --prefix=/usr/local/mysql \

--datadir=/data/dbdata/data \

--enable-thread-safe-client \

--enable-assembler \

--enable-local-infile \

--with-charset=utf8 \

--with-collation=utf8_general_ci \

--with-extra-charsets=all \

--with-unix-socket-path=/var/run/mysql/mysql.sock \

--without-debug \

--with-embedded-server \

--with-big-tables

# make --jobs=`grep processor/proc/cpuinfo | wc -l`

# make install

# cp ./support-files/mysql.server /etc/init.d/mysqld

# chmod +x /etc/init.d/mysqld

# chkconfig --add mysqld

# chkconfig mysqld on

# cd /usr/local

# mv mysql mysql-5.0.27

# ln -s mysql-5.0.27 mysql

# chmod +w /usr/local/mysql

# chown -R mysql:mysql /usr/local/mysql/

# vim /etc/ld.so.conf

/usr/local/mysql/lib/mysql

# /sbin/ldconfig

# cd /etc

# rm -f my.cnf && ln -s my_old.cnf my.cnf

# vim my.cnf

……

innodb_data_file_path = ibdata1:1024M:autoextend

innodb_log_file_size = 512M

innodb_log_files_in_group = 3

……

注意:

以上我们故意在开始部署MySQL环境时,将表空间文件分配的少一些,这样可以让MySQL启动的快一些,同时也为接下来的恢复操作以作区别。也需要注意一下以下附件中的参数“bind-address”、“server-id”。

# cd /usr/local/mysql

# ./bin/mysql_install_db --datadir=/data/dbdata/data --user=mysql

# service mysqld start

2、编译安装xtrabackup

在此省略,可以参考之前的步骤,或者直接将之前编译后的二进制文件拷贝过来即可。

3DB数据恢复

# mkdir -p /data/mysql_backup

# tar -ixvzf /data/mysql_backup.tgz -C /data/mysql_backup

注意:

在做tar解压操作时,一定要加上“-i”参数。

# service mysqld stop

# cd /data/dbdata

# mv data data.old && mkdir data

# rm -rf binlog/*

# cd /etc

# rm my.cnf && ln -s my_new.cnf my.cnf

……

innodb_data_file_path =ibdata1:2000M;ibdata2:2000M;ibdata3:2000M;ibdata4:2000M;ibdata5:2000M;ibdata6:2000M;ibdata7:2000M;ibdata8:2000M;ibdata9:2000M;ibdata10:2000M;ibdata11:2000M;ibdata12:2000M;ibdata13:2000M;ibdata14:2000M;ibdata15:2000M;ibdata16:2000M;ibdata17:2000M;ibdata18:2000M;ibdata19:2000M;ibdata20:2000M;ibdata21:2000M;ibdata22:2000M;ibdata23:2000M;ibdata24:2000M;ibdata25:2000M;ibdata26:2000M;ibdata27:2000M;ibdata28:2000M;ibdata29:2000M;ibdata30:2000M;ibdata31:2000M;ibdata32:2000M;ibdata33:2000M;ibdata34:2000M;ibdata35:2000M;ibdata36:2000M;ibdata37:2000M;ibdata38:2000M;ibdata39:2000M;ibdata40:2000M;ibdata41:2000M;ibdata42:2000M;ibdata43:2000M;ibdata44:2000M;ibdata45:2000M;ibdata46:2000M;ibdata47:2000M;ibdata48:2000M;ibdata49:2000M;ibdata50:2000M;ibdata51:2000M;ibdata52:2000M;ibdata53:2000M;ibdata54:2000M;ibdata55:2000M;ibdata56:2000M;ibdata57:2000M;ibdata58:2000M;ibdata59:2000M;ibdata60:2000M;ibdata61:2000M;ibdata62:2000M;ibdata63:2000M;ibdata64:2000M;ibdata65:2000M;ibdata66:2000M;ibdata67:2000M;ibdata68:2000M;ibdata69:2000M;ibdata70:2000M;ibdata71:2000M;ibdata72:2000M;ibdata73:2000M;ibdata74:2000M;ibdata75:2000M;ibdata76:2000M;ibdata77:2000M;ibdata78:2000M;ibdata79:2000M;ibdata80:2000M;ibdata81:2000M;ibdata82:2000M;ibdata83:2000M;ibdata84:2000M;ibdata85:2000M;ibdata86:2000M;ibdata87:2000M;ibdata88:2000M;ibdata89:2000M;ibdata90:2000M;ibdata91:2000M;ibdata92:2000M;ibdata93:2000M;ibdata94:2000M;ibdata95:2000M;ibdata96:2000M;ibdata97:2000M;ibdata98:2000M;ibdata99:2000M;ibdata100:2000M;ibdata101:2000M;ibdata102:2000M;ibdata103:2000M;ibdata104:2000M;ibdata105:2000M;ibdata106:2000M;ibdata107:2000M;ibdata108:2000M;ibdata109:2000M;ibdata110:2000M;ibdata111:2000M;ibdata112:2000M;ibdata113:2000M;ibdata114:2000M;ibdata115:2000M;ibdata116:2000M;ibdata117:2000M;ibdata118:2000M;ibdata119:2000M;ibdata120:2000M;ibdata121:2000M:autoextend

innodb_log_file_size = 256M

innodb_log_files_in_group = 2

……

注意:

以上参数要和旧环境对应,否则无法启动,如果参数“innodb_log_files_in_group”在旧环境没有设置,此处可以忽略不设置,默认值为2。也需要注意一下以下附件中的参数“bind-address”、“server-id”。

# innobackupex --apply-log /data/mysql_backup

# innobackupex --copy-back /data/mysql_backup

# cp -a /usr/local/src/mysql-5.0.27/sql/share/* /data/dbdata/data/mysql/

注意:

以上步骤必须进行,否则会报错,导致启动失败。

# chown -R mysql:mysql /data/dbdata/data

# service mysqld start

## 至于另一台服务器(10.217.121.216)的DB数据恢复,可以将“10.217.121.196”上的解压数据同步过来,然后按照同样的方式进行恢复即可

# rsync -arvPz -e "ssh -lroot -p36000" /data/mysql_backup/ 10.217.121.216:/data/mysql_backup/

4、主从关系建立

(1)DB账号恢复

将“172.17.138.239”的“mysql”数据库导出,然后导入到“10.217.121.196”

将“172.17.138.239”的从DB的“mysql”数据库导出,然后导入到“10.217.121.216”

(2)、“10.217.121.196”与“10.217.121.216”主从关系建立

在“10.217.121.196”上的操作:

# mysql -uroot -e "grant replication slave on *.* to ‘repl‘@‘10.217.121.216‘ identified by ‘repl123456‘;"

# mysql -uroot -e "flush privileges;"

# mysql -uroot -e "show master status\G"

在“10.217.121.216”上的操作:

# mysql -uroot -e "change master to master_host=‘10.217.121.196‘,master_user=‘repl‘,master_password=‘repl123456‘,master_log_file=‘XXX‘,master_log_pos=XXX;"

# mysql -uroot -e "start slave;"

# mysql -uroot -e "show slave status\G"

注意:

以上标注部分,需要根据实际情况填写即可。

(3)、“172.17.138.239”与“10.217.121.196”主从关系建立

在“172.17.138.239”上的操作:

# mysql -uroot -e "grant replication slave on *.* to ‘repl‘@‘10.217.121.196‘ identified by ‘repl123456‘;"

# mysql -uroot -e "flush privileges;"

# mysql -uroot -e "show master status\G"

在“10.217.121.196”上的操作:

# cat /data/mysql_backup/xtrabackup_binlog_info

# mysql -uroot -e "change master to master_host=‘172.17.138.239‘,master_user=‘repl‘,master_password=‘repl123456‘,master_log_file=‘TaeSupport.001635‘,master_log_pos=436953160;"

# mysql -uroot -e "start slave;"

# mysql -uroot -e "show slave status\G"

最终的主从关系如下:

172.17.138.239 à 10.217.121.196  à 10.217.121.216

Mater             Master Slave        Slave

注意:

以上3台DB的配置文件“/etc/my.cnf”中的“server-id”参数,必须保持不相同,否则你懂得 ^_^

业务侧切换时,只需指向新的主DB“10.217.121.196”即可,待确认无误后,停掉之前建立的“172.17.138.239”与“10.217.121.196”主从关系,而“10.217.121.196”与“10.217.121.216”主从关系需保留不动。

==========================================================================================

五、一些问题总结

==========================================================================================

1、由于MySQL-5.0.26的版本存在较多BUG,官方已不提供下载,所以本次的新环境采用MySQL-5.0.27;

2、之前尝试迁移到5.1、5.5系列版本,但在做主从设置时,总会报错,尝试了MySQL-5.0.37版本也不行,这也验证了MySQL-5.0.26的确存在BUG的可能性;

3、目前我们在MySQL-5.0.26与MySQL-5.0.27之间建立主从关系是可以的,但个人还是比较推荐5.5系列的版本,接下来可以尝试在MySQL-5.0.27与MySQL-5.5.X之间建立主从;

4、本次迁移工作也比较耗时,主要是涉及到太多表空间文件,其实逻辑数据也没那么多,个人觉得之前的旧环境下的“innodb_data_file_path”参数设置不是太合理,可以考虑对ibdata进行瘦身和配置调整;

5、在迁移过程中,却发现之前的64为环境下,运行的却是32位版本的MySQL,这样就会导致一个问题,就算你在64位环境下,内存再多,而你的缓冲池大小最多也只能设置到4G。

本文出自 “人生理想在于坚持不懈” 博客,请务必保留此出处http://sofar.blog.51cto.com/353572/1598364

时间: 2024-10-09 18:40:54

MySQL数据库迁移详细步骤(转)的相关文章

MySQL数据库迁移详细步骤

========================================================================================== 一.背景简介 ========================================================================================== 1.问题描述 由于机房搬迁,需要对后台DB服务器进行迁移,同时为了保证在数据迁移过程中,对线上业务不造成影响,并能够做到秒

JSP中使用JDBC连接MySQL数据库的详细步骤

1,首先在自己新建的项目文本框中输入Web Project的名称,然后单击下一步. 2,继续单击下一步 3,把Generate web.xml deployment descriptor复选框勾上. 4,单击Finish,完成Web project工程的创建. 5,打开MyEclipse Datebase Explore,如图所示 6,按图中所示填写各项内容,并通过Add JARS添加相应的数据库驱动程序. 7,通过Test Driver测试驱动是否连接成功,需要输入密码.成功后如下图所示 8,

MySQL数据库迁移(转)

MySQL数据库迁移(数据文件直接迁移) 在今年10月下旬的时候,公司的服务器需要迁移,其中涉及到了MySQL数据库迁移.查看了一下MySQL数据文件的大小,接近60G的大小(实际数据并没用那么多).由于服务器上业务需要,要尽量减少服务器迁移时的损失.所以迁移时间选在了晚上零点开始,而且要尽量减少迁移所用的时间. 在迁移之前有三种方案: 数据库直接导出,拷贝文件到新服务器,在新服务器上导入. 使用[MySQL GUI Tools]中的 MySQLMigrationTool. 数据文件和库表结构文

JDBC连接sql server数据库的详细步骤和代码

JDBC连接sql server数据库的详细步骤和代码 JDBC连接sql server数据库的步骤如下: [java] view plaincopyprint? 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现. 成功加载后,会将Driver类的实例注册到DriverManager类中. 2.提供JDBC连接的URL •连接URL定

django 中连接mysql数据库的操作步骤

django中连接mysql数据库的操作步骤: 1 settings配置文件中 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm02', # 库的名字 'USER':'root', # 数据库的用户名 'PASSWORD':'666', # 数据库的密码 'HOST':'127.0.0.1', 'PORT':3306, } } 2 项目文件夹下的init文件中写上下面内容,用pymysql替

linux操作mysql数据库常用简单步骤

连接mysql数据库: 主要看mysql安装在哪一个目录下: mysql -h主机地址 -u用户名 -p用户密码 或者mysql -h ip地址 -u  zaiai -p zaiai 或者/var/email/mysql/bim/mysql mysql数据库中sql修改字段类型 首先说明一下: 在mysql数据库中可以对表的字段类型进行修改的,这样的好处是正常情况下原来的数据不会丢失的. 它的语法规则是:alter table newexample modify id char(20); 这里详

java用JDBC连接MySQL数据库的详细知识点

想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downloads/connector/j/ 2.MySQL数据库安装包的下载和安装:http://pan.baidu.com/s/1sleNubV 3.在dos命令窗口中对mysql进行配置和使用.配置如下: ①在开始菜单的搜索框中输入"cmd"命令. ②把安装mysql软件的路径到bin目录下输入

mysql数据库迁移文档

数据库迁移文档 一.需求 确保数据库稳定的运行,为开发人员提供方便的测试数据库和生产数据库的环境. 二.数据库整体架构(master/slave) 三.数据库迁移备份还原操作 测试数据库导出操作 mysqldump -uroot -p123456 miss8 > miss8.sql Master节点,Slave节点导入数据库 mysql -uroot -piminerroot miss8 < miss8.sql 四.数据库迁移具体配置 一定要确保Master节点和Slave节点数据相同 配置M

MYSQL数据库迁移到POSTGRESQL数据库(人工迁移)

产品即将上线,可项目经理说要换数据库,要把mysql数据库的内容全部搬到Postgresql中去. 有一个python的工具可以实现迁移(但是存储过程无法迁移.数据类型也无法灵活对应,还要改程序),为了节约时间采用人工迁移的方式,闲话少说,以下是迁移过程,没图,对不起. 利用Navicat for Mysql工具(其它工具也可以,比如mysqldump)将数据库模式导出(只导表结构不含数据)方法略,生成的文件名为mysql.sql 利用linux sed工具把导出的脚本中的所有COMMENT及m