MySQL数据库迁移详细步骤

article/2025/9/25 12:26:33

转载自:http://sofar.blog.51cto.com/353572/1598364

 

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

一、背景简介

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

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

wKioL1Sle23gJEENAAGrib3fJE4198.jpg

# ./utils/build.sh innodb50

 

注意:

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

 

# cat BUILD.txt

wKiom1Sletqgul4OAAH8vqvIV1Y082.jpg

 

# vim ./utils/build.sh

wKioL1Sle7rzHU1zAAFIofoY-vw592.jpg

 

# 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 root@10.133.33.85" 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

wKioL1Sle92y6zdMAADQ3qIGrBw532.jpg

注意:

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

 

# ps aux | grep mysql[d]

wKiom1Sle1uBdvSsAACF854w3gU614.jpg

注意:

根据以上信息,我们需要将以下参数添加到配置文件中(/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

wKioL1SlfEPSY_ggAAFK_5KHJBI850.jpg

注意:

出现这种错误信息,是因为备份目录“/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 root@10.217.121.196 "cat - > /data/mysql_backup.tgz"

 

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

wKiom1Sle7mhPOmmAANwtN3xasM795.jpg

 

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

wKioL1SlfJPjjYNIAAC3KddRM2Y208.jpg

 

注意:

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

 

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

四、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

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

 

3、DB数据恢复

# 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

wKiom1SlfB_x0Ws_AAGgXllxMPE516.jpg

 

# innobackupex --copy-back /data/mysql_backup

wKioL1SlfPrDqcHUAAGY3jSXPf0357.jpg

 

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

wKiom1SlfGGCZT11AAEauf9V-9A428.jpg

 

注意:

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

 

# 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

wKiom1SlfLyR4PafAABOJl1HRrY089.jpg

 

# 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://chatgpt.dhexx.cn/article/YWiinILE.shtml

相关文章

mysql数据库迁移到达梦数据库

说明:在windowns上安装达梦数据库,并从mysql5.7迁移到达梦数据库8,此处使用的是达梦数据库的试用版本,如果要安装标准版或者企业版,可以花钱购买。 下载安装包 从达梦官网下载安装包,下载地址:https://ww…

Mysql数据库迁移问题解决方案

目录 问题描述错误原因解决方案其他问题运行选项问题SQL代码问题旧数据库迁移新数据库问题 问题描述 使用 Navicat 导入之前转储好的 sql 文件,报错 错误原因 1、在信息日志当中往上翻,发现没有选择数据库,所以报错的原因就是没有提前创建…

【MySQL】如何把Windows上的MySQL数据库迁移到Linux服务器上

目录 1. 前言2. 物理备份与逻辑备份3. mysqldump实现逻辑备份4. 逻辑恢复 1. 前言 最近在学黑马的《瑞吉外卖》,前期的基础版本一致在 Windows 电脑上开发,包括 MySQL 数据库也是安装在 Windows 电脑上。最近才学到优化篇,安装了 Linux 虚拟…

MySQL数据库迁移(数据文件直接迁移)

MySQL数据库迁移 MySQL数据库迁移(数据文件直接迁移) 在今年10月下旬的时候,公司的服务器需要迁移,其中涉及到了MySQL数据库迁移。查看了一下MySQL数据文件的大小,接近60G的大小(实际数据并没用那么多)。由于服务器上业务需要,要尽…

mysql——数据库之间的迁移

今天继续给大家分享mysql数据库的知识 不同数据库之间的迁移 不同数据库之间迁移是指从其他类型的数据库迁移到MySQL数据库,或者从MySQL数据库迁移到其他类型的数据库。例如,某个网站原来使用Oracle数据库,因为运营成本太高等诸多原因&…

mysql数据库迁移方案

怎样用命令行把MySQL数据库迁移到另一台Linux服务器 1、用dump命令备份数据库。 #mysqldump-uroot-pdbfile>dbfile.sql 2、用rsync从新服务器获得备份的文件(SCP或WGET也可以)。 #rsync-avrrootmyolddbserver:/home/mydumpfolder/dbfile.sql 3、登陆新服务器的mysql客户端。…

mysql数据库数据迁移方法

说明:这里不讨论命令行还有通过navicat等工具的做法,这里只讨论在mysql坏掉(不能启动)的情况下,怎么办。 方法: a) 先来看mysql数据库文件的情况: mysql坏掉了,不管是linux还是wi…

MySQL数据库迁移(直接复制文件)

原地址:http://www.cnblogs.com/advocate/archive/2013/11/19/3431606.html MySQL数据库迁移(数据文件直接迁移) 在今年10月下旬的时候,公司的服务器需要迁移,其中涉及到了MySQL数据库迁移。查看了一下MySQL数据文件的大小,接近60…

MySQL数据库迁移方法

一、停止MySQL服务 此电脑右键 – 管理 – 服务,找到 MySQL 停止 二、修改路径 到C:\ProgramData\MySQL\MySQL Server x.x找到my.ini,打开它 第95行datadir改成目标路径,特别注意目标路径分隔符必须为 “\”,否则不成功&…

Mysql数据库迁移|如何把一台服务器的mysql数据库迁移到另一台服务器上的myql中

前言 那么这里博主先安利一下一些干货满满的专栏啦! Linux专栏https://blog.csdn.net/yu_cblog/category_11786077.html?spm1001.2014.3001.5482操作系统专栏https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482手撕数据结构https:/…

MySQL数据迁移

1、停止MySQL服务 右击 我的电脑—>管理—>服务和应用程序 —>服务—>Mysql—>停止 2、将原磁盘路径下的数据复制到需要迁移到路径下 如:将C:\projectDeploy\mysql\mysql5.6\mysql5.6\MySQL Server 5.6\data中的数据复制到 D:\mysql\dat…

数据迁移的几种方式 - MySQL数据库

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

mysql数据库数据迁移操作

1.新建一个需要迁移的数据库 2.进行数据迁移 迁移步骤: 1.工具-->点击 数据传输 ,选择需要被导的数据库,和导入的数据库 看到了吗以及导入成功了

mysql迁移数据库

mysql迁移数据库我通常用2种方法。1、用sql文件把机器A中数据库的表结构和数据等等导出,然后导入到机器B中对应数据库中。2、直接将机器A中mysql 目录下的data数据文件拷贝到机器B中MySQL对应目录。下面分别介绍这2种mysql迁移数据库方式 1、用sql文件把A服务器数据…

MySQL的数据迁移

一、前言 数据库的数据迁移是我们经常遇到的问题,如因磁盘空间不够、业务出现瓶颈、项目改造等原因。 二、MySQL数据迁移常用的方法 1、使用第三方迁移工具。 2、数据文件和库表结构直接拷贝到新服务器,挂载到同样配置的MySQL服务下。 3、数据库直接导…

你觉得做程序员期间最开心的是什么?

不管是新入行的程序员还是工作多年的程序员,都会想一个问题,在这份工作中最开心的事情是什么呢?是无bug还是工作中发生的其他一些事情? 今天我们邀请了 3 名淘系技术的工程师,结合他们真实的学习工作经历,给…

限时免费下载《程序员面试宝典》.pd

社会竞争很残酷、面试则是一场表演,企业永远喜欢可以随机应变、聪明的求职者。 程序员的面试不同于一般岗位的面试。 当你在羡慕程序员十几万美金年薪的同时,你却不知道他们在应付面试时,要经历的重重磨难和压力。 程序员面试中,技…

互联网行业职位介绍 —— OD、PM、RD、FE、UE、QA、OP、DBA...

各种职位的简称在百度上一搜一大堆,我也只是根据自己公司的习惯,把常用的总结下来: 1、管理层 CEO – Chief Executive Officer 首席执行官 VP – Vice President 副总裁 HRD – Humen Resource Director 人力资源总监 OD – Operations…

浩鲸科技是外包公司吗_广东电商外包服务公司是什么意思_聚财猫科技

首页 > 新闻中心 发布时间:2020-11-12 02:11:12 导读:聚财猫科技为您提供广东电商外包服务公司是什么意思的相关知识与详情: 这种类型的公司缺乏运营团队的能力和技能。 在与客户的对话中,不强调团队的人数,合作伙…

阿里数据产品经理工作(总结篇):数据PD,做牛做马

送给真正的互联网人一顿干货早餐 【小咖导读】文自 听雨-悟禅 博客,PD(指产品经理,下同)本身就是在做牛做马,关系圈异常复杂。数据PD也不例外。而且打交道的人更多。以下是作者用PPT绘制的数据产品经理关系圈。 科普&a…