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 ⾃动定期备份(完整备份)
完整备份⼀般⼀段时间进⾏⼀次,且在⽹站访问量最⼩的时候,这样常借助批处理⽂件定时备份。
主要原理是写⼀个批处理⽂件,在⾥⾯写上处理程序的绝对路径然后把要处理的东西写在后⾯。
mysql怎么导出数据库给别人
然后在控制⾯板上,创建任务。任务指定该批处理⽂件的执⾏时间。但是执⾏⼀次该⽂件产⽣的备份都会覆盖上⼀次的⽂件。
⾃动运⾏(有些版本为“计划”):
新建批处理作业,备份-选择数据库-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 到⽬标数据库后,确保没有任何异常后再从⽬标数据库中重新创建这些原有的数据库,最后还原回来,尽可能做到万⽆⼀失。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论