Mysql 单机数据库迁移几种方式

一 为什么要迁移

MySQL 迁移是 DBA 日常维护中的一个工作。迁移,究其本义,无非是把实际存在的物体挪走,保证该物体的完整性以及延续性。就像柔软的沙滩上,两个天真无邪的小孩,把一堆沙子挪向其他地方,铸就内心神往的城堡。

生产环境中,有以下情况需要做迁移工作,如下:
1.磁盘空间不够。比如一些老项目,选用的机型并不一定适用于数据库。随着时间的推移,硬盘很有可能出现短缺;
2.业务出现瓶颈。比如项目中采用单机承担所有的读写业务,业务压力增大,不堪重负。如果 IO 压力在可接受的范围,会采用读写分离方案;
3.机器出现瓶颈。机器出现瓶颈主要在磁盘 IO 能力、内存、CPU,此时除了针对瓶颈做一些优化以外,选择迁移是不错的方案;
4.项目改造。某些项目的数据库存在跨机房的情况,可能会在不同机房中增加节点,或者把机器从一个机房迁移到另一个机房。再比如,不同业务共用同一台服务器,为了缓解服务器压力以及方便维护,也会做迁移。

一句话,迁移工作是不得已而为之。实施迁移工作,目的是让业务平稳持续地运行。

二 MySQL 迁移方案概览

MySQL 迁移无非是围绕着数据做工作,再继续延伸,无非就是在保证业务平稳持续地运行的前提下做备份恢复。那问题就在怎么快速安全地进行备份恢复。

一方面,备份。针对每个主节点的从节点或者备节点,都有备份。这个备份可能是全备,可能是增量备份。在线备份的方法,可能是使用 mysqldump,可能是 xtrabackup,还可能是 mydumper。针对小容量(10GB 以下)数据库的备份,我们可以使用 mysqldump。但针对大容量数据库(数百GB 或者 TB 级别),我们不能使用 mysqldump 备份,一方面,会产生锁;另一方面,耗时太长。这种情况,可以选择 xtrabackup 或者直接拷贝数据目录。直接拷贝数据目录方法,不同机器传输可以使用 rsync,耗时跟网络相关。使用 xtrabackup,耗时主要在备份和网络传输。如果有全备或者指定库的备份文件,这是获取备份的最好方法。如果备库可以容许停止服务,直接拷贝数据目录是最快的方法。如果备库不允许停止服务,我们可以使用 xtrabackup(不会锁定 InnoDB 表),这是完成备份的最佳折中办法。

另一方面,恢复。针对小容量(10GB 以下)数据库的备份文件,我们可以直接导入。针对大容量数据库(数百GB 或者 TB 级别)的恢复,拿到备份文件到本机以后,恢复不算困难。具体的恢复方法可以参考第三节。

三 MySQL 迁移实战

我们搞明白为什么要做迁移,以及迁移怎么做以后,接下来看看具体的几种操作方式。

3.1 使用数据库管理工具(Navicat)

3.1.1 导出、导入sql文件方式

(1)导出sql文件:选择需要导出数据库表,右击--->转储为sql文件---->结构和数据

选择存储目录,采用默认的数据表名,点击确认即可。

(2)导入sql文件:导入时先创建好数据库,右键数据库或表,运行sql文件

会出现如下的界面,选择你要导入的sql文件,点击开始。

注意:观察错误的数量,若错误数量为0,点击关闭即可。

3.1.2 手动备份(冷备份)

手动备份比较简单,最后生成备份文件即可,可以自己另外保存:

新建备份,输入备份信息:

 

对象选择,选择需要备份的表、视图、函数、事件:

 高级,是否锁定表、使用单一事物、指定文件名:

 开始备份:

 关闭,是否保存当前配置,以备以后直接用于备份:

刷新备份,可见备份信息,用于还原:

  

3.1.3 自动定期备份(完整备份)

完整备份一般一段时间进行一次,且在网站访问量最小的时候,这样常借助批处理文件定时备份。

主要原理是写一个批处理文件,在里面写上处理程序的绝对路径然后把要处理的东西写在后面。

然后在控制面板上,创建任务。任务指定该批处理文件的执行时间。但是执行一次该文件产生的备份都会覆盖上一次的文件。

自动运行(有些版本为“计划”):

 

 新建批处理作业,备份-选择数据库-Backup-添加工作:

 保存,输入文件名:

设置任务计划,安全选项:

  • 只在用户登录时运行:只有用户登录自己的Windows电脑的时候才执行;
  • 不管用户是否登录都要运行:不管用户是否登录Windows电脑,只要电脑是开着的都执行;

 新建触发器:

设置触发器:

 

输入Windows电脑用户名和密码:

 

自动运行,备份可以检查是否设置成功:

这里因为用的数据库引擎是myisam,因此没办法做增量备份(mysqlbackup对 myisam进行的是锁表全备.就算是增量备份,它依然是全备.)

3.2 使用mysqldump数据导出和source数据导入

注意:

  • mysqldump命令要在dos窗口或者shell窗口,不需要登录进去数据库里面执行;
  • source命令必须登录进去数据库里面执行;

3.2.1 mysqldump导出数据

mysqldump命令要在dos窗口或者shell窗口,不需要登录进去数据库里面执行;

①导出所有数据库(包括系统数据库)到指定文件下

mysqldump -u$$$ -p*** --all-databases > /root/all.sql

注:$$$为用户***为用户密码(最好回车后填写)命令后面没有任何标点符号

以下不在提示,本人使用root用户,密码为123456

②导出db1和db2两个数据库的所有数据

mysqldump -uroot -p123456 --databases db1 db2 > /root/db1_2.sql

③只导出表结构不导出数据:--no-data (或者 -d)

mysqldum -utoot -p123456 --no-data --database db1 > /root/db1_ddl.sql

④只导出表数据不导出表结构: -t

mysqldum -utoot -p123456 -t --database db1 > /root/db1_dml.sql

⑤跨服务器导出导入数据

mysqldump --host=192.168.252.157 -uroot -p123456 -C --database db1 |mysql --host=192.168.252.159 -uroot -p123456 db1

注意:加上-C参数可以启用压缩传递

3.2.1 source导入数据

source命令必须登录进去数据库里面执行;

(1)导入数据库

登录进入mysql界面使用CREATE命令创建数据库后使用USE命令进入该数据库,然后再使用SOURCE命令即可导入数据库

注:如果sql文件中已经有数据库创建语句,则不用使用CREATE和USE命令

例如:导入数据库db1

CREATE DATABASE db1;

USE db1;

SOURCE /root/dn1.sql;

(2)导入数据表

登录进入mysql界面选择数据库使用SOURCE命令即可

3.2 使用拷贝data目录文件的方式迁移mysql数据库

其实迁移数据库,一般用sql文件就行,把A服务器数据库的表结构和数据等等导出,然后导入到B服务器数据库,

但是如果数据文件过大,好几十个G的数据,使用命令行导入,效果不是很好,经常在执行过程中报错、卡死。

步骤如下:

1.首先要确定data目录在哪里

 其实是拷贝mysql的数据存放路径,Linux默认路径为:

/var/lib/mysql/

也可以使用命令来查找data目录:

mysql> show global variables like "%datadir%";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

mysql>

2.需要拷贝的文件包括:数据库文件 和  ibdata1  (这个必须拷贝)

3.停掉mysql服务,将拷贝的文件复制到目标数据库的data目录中

拷贝源数据库文件ibdta1到目标数据库的data目录中

[root@localhost mysql]# scp -r 数据库文件 root@192.168.252.159:/var/lib/mysq

[root@localhost mysql]# scp -r ibdata1 root@192.168.252.159:/var/lib/mysql

到目标数据库服务器:

[root@localhost mysql]# chown -R mysql:mysql financial/
[root@localhost mysql]# chmod -R 755 financial/

如果没有进行上面授权会出现如下错误:

4.复制好后,启动mysql服务,用数据库连接工具连接数据库即可看到导进来的数据库

# mysql5.7启动命令
systemctl start mysqld.service

# mysql5.6启动命令
service mysql start

 注意:如果目标数据库原有数据库,当从源数据库拷贝ibdta1到目标数据库后,目标数据库原有的数据库会出现异常:包括删除该数据库报错、操作数据库时候异常:[ERR] 1813 - Tablespace '`yzy_test`.`admin_user`' exists.

 所以,在拷贝数据库文件 和  ibdata1  到目标数据库前最好先备份好原有的数据库,然后drop掉这些原有的数据库,当从源数据库拷贝数据库文件和 ibdata1 到目标数据库后,确保没有任何异常后再从目标数据库中重新创建这些原有的数据库,最后还原回来,尽可能做到万无一失。

原文地址:https://www.cnblogs.com/yang5726685/p/15703009.html