使用 mysqldump 备份远程或本地数据库的表结构和数据,精品总结,必看!

起因是因为我用阿里云的 RDS 想导出数据库到本地测试时发现了问题,就是使用 DMS 控制台导出的数据库表结构和表数据的时候,会出现一些问题情况,导出的数据库无法在本地 mysql 进行导入

即当我定义 mysql 表的某个字段为 not null 并设置了默认值之后,却发现导出的结果中,那个字段内容为空,理论上内容为空的时候,出来的应该是默认值嘛,但是却给我导出一个 null 来,这样的话在本地测试库进行导入的时候就会报错了,因为会提示该字段不允许为空值,从而导入失败。

但是使用 mysqldump 来进行导出经过测试发现却是正常的,因此这里咱们来总结一下如何使用 mysqldump 来导出远程或本地的数据库内容吧!

找到 mysqldump.exe

首先你需要在本地有安装 mysql,就能正常找到,当然你也可以单独复制一个从别的机器准备好的 mysqldump.exe 文件过来。如果是本地有安装 mysql,则可以到安装目录下的 bin 目录下找到 mysqldump.exe。可以单独复制出来也可以使用 cmd 进入该文件夹执行。

使用 mysqldump 进行导出

远程数据库导出

导出远程库的命令模板:

mysqldump -h远程地址 -u登录用户名 -p登录密码 --set-gtid-purged=OFF 数据库名 > 导出的sql名或完整路径

这样的写法可以导出整个数据库的表结构和表数据到本地。

  • 远程地址:可以是个 IP 地址,也可以是一个指定的域名,看远程怎么规定。比如 RDS 就是外网访问域名,不用端口号
  • -u:输入数据库登录的用户名
  • -p:输入数据库登录的密码,如果密码打算不写在命令行中,可以仅输入 -p,运行后会让你输入密码
  • --set-gtid-purged=OFF:这一块找了一些网络资料,但还不是完全理解,先记录下来
    关于 GTID 是 5.6 以后,加入了全局事务 ID (GTID) 来强化数据库的主备一致性,故障恢复,以及容错能力。
    官方给的解释:A global transaction identifier (GTID) is a unique identifier created and associated with each transaction committed on the server of origin (master).
    所以可能是因为在一个数据库里面唯一,但是当导入其他的库就有可能重复。所有会有一个提醒。
    加了--set-gtid-purged=OFF 时,在会记录 binlog 日志,如果不加,不记录 binlog 日志,所以在我们做主从用了 gtid 时,用 mysqldump 备份时就要加 --set-gtid-purged=OFF,否则你在主上导入恢复了数据,主没有了 binlog 日志,同步则不会被同步。
    不过这个提示只有在开启了 GTID 的机器上才会提示警告。简单一点来讲,我们就按照提示的警告添加一下这个即可。
  • 数据库名:输入要导出的数据库的名字
  • 导出的sql名或完整路径:如果只输入 sql 名,则默认会导出到当前所在的目录下,如果写完整路径,则可以指定导出到的位置,如果路径含有空格,记得加英文引号

于是我们有如下例子:

mysqldump -hexample.mysql.rds.aliyuncs.com -uroot -proot --set-gtid-purged=OFF test > C:\Users\xueshanlinghu\Desktop\test\output.sql

运行即可发现很快导出完毕。

本地数据库导出

导出本地库的命令模板,其实很简单,就是把远程地址部分去掉即可。

mysqldump -u登录用户名 -p登录密码 --set-gtid-purged=OFF 数据库名 > 导出的sql名或完整路径

仅导出表结构

多了 -d

mysqldump -h远程地址 -u登录用户名 -p登录密码 --set-gtid-purged=OFF -d 数据库名 > 导出的sql名或完整路径

仅导出表数据

多了 -t

mysqldump -h远程地址 -u登录用户名 -p登录密码 --set-gtid-purged=OFF -t 数据库名 > 导出的sql名或完整路径

导出指定的表

在数据库名后面空格加上表名即可,如果需要仅导出表结构或仅导出表数据,加上 -d-t 即可。

mysqldump -h远程地址 -u登录用户名 -p登录密码 --set-gtid-purged=OFF 数据库名 数据表名> 导出的sql名或完整路径

后记
在写这篇文章的同时,我也给阿里云提了工单处理这个问题,提了这个 bug,刚开始的时候工单处理的人还觉得没啥问题。然后我就说这个确实是有问题的,导出的数据库内容都不能用,可咋整。于是他们的客服就跟研发讨论了一下表示过几天上一个版本修复这个问题。

过了几天,他们修复好了,我去一测试,发现还是报错,仔细一看,原来啊,他们修改后是把日期时间型的内容裸露出来了,但是这在导入时是不允许的,不能正常读取的,我又继续沟通,他们一开始还是觉得就是这样没错呀,于是我说应该怎么怎么滴才是对滴,于是他们客服又去跟研发讨论去了,这次讨论的时间比较长,大概花了两三天吧,给了我一个答复说三天后修复一个版本来修复这个问题。

于是我又等了三四天,他们跟我说修复好了,于是我做了测试,发现这次,成功导入了!终于解决了问题,也对他们表示了感谢。阿里云的工单还是比较靠谱的用了这么多次以来。

也就是说,如果中途阿里云没有再变化的话,他们的 DMS 导出整库的功能应该是正常的了,希望你使用愉快!也希望我的一点努力能解决其他使用阿里云这款产品的朋友的问题和疑虑。

评论区
头像
文章目录