mysqldump使用详解

mysqldump的详细用法:

首先一步一步实验,创建一个用户,只授予某一个库的读取权限:

create user dump_test@"%" identified by "dump_test123";

grant select on test.* to dump_test@"%";

然后采取最基本的默认的备份方式:

从图中可以看到错误是因为缺少lock权限,为了保证数据的一致性,mysqldump对备份的表会默认加一个只读锁,可以使用

--skip-lock-tables to disable跳过

这里用到第一个参数:-l, --lock-tables   Lock all tables for read.(Defaults to on; use --skip-lock-tables to disable.)

加上skip之后:

可以看到成功备份了表

接下来授权用户创建和插入权限

然后还原备份的数据

这时候可以看到报错是因为用户没有drop权限,这是因为mysqldump默认是添加drop table命令的,这涉及到第二个参数

这个参数是用来在建表前删除表的,默认开启。可以使用--skip-add-drop-table跳过

--add-drop-table    Add a DROP TABLE before each create. (Defaults to on; use --skip-add-drop-table to disable.)

我们加上新的参数重新备份然后还原

这里我们看到--skip-add-drop-table已经起作用了,然后我们手动进行删除表e,进行还原

这时候报错运行到34行的时候没有权限执行,那么我们看一看34行是什么

这时候需要用到另一个参数了--add-locks    Add locks around INSERT statements.(Defaults to on; use --skip-add-locks to disable.),--add-locks在INSERT语句周围添加锁。
其作用是防止其他线程改变本张表的数据,默认开启,可以使用--skip-add-locks禁用

我们接下来看一看添加了--skip-add-locks之后的备份还原效果

这时候我们看到了报错显示用户没有alter权限,这里涉及到了另一个参数 -K, --disable-keys

 '/*!40000  ALTER TABLE tb_name DISABLE KEYS */; and'/*!40000 ALTER TABLE tb_name ENABLE KEYS */;

will be put in the output.(Defaults to on; use --skip-disable-keys to disable.),

此参数用来停用和启用索引,在插入数据之前禁用索引,在数据插入完成后启用索引,从而使数据可以快速导入,默认开启,可以使用--skip-disable-keys禁用,接下来使用--skip-disable-keys进行备份,然后还原

可以看到并没有报错,数据已经成功还原

下面介绍其他的参数

-h, --host=name     Connect to host. 链接的ip
-P, --port=#        Port number to use for connection.  链接的端口
-u, --user=name     User for login if not current user. 链接的用户名称
-p, --password[=name] Password to use when connecting to server. If password is not given it's solicited on the tty. 链接的用户密码

--allow-keywords:允许使用关键词作为列名,但是会在列名之前加上表名作为前缀,目前没有发现有任何用处,建表或修改表时用关键字做列名不成功,在关键字上加上反引号可以成功,但这样不加该参数也是可以成功

-i, --comments      Write additional information.(Defaults to on; use --skip-comments to disable.),为备份文件添加注释信息,如数据库版本等信息,默认开启,可以通过--skip-comments禁用

  -c, --complete-insert 使用完整的插入语句
加入该参数之前的效果

加入该参数之后的效果

很明显能看出二者的差别

-C, --compress 在客户端和服务器之间启用压缩传递所有信息,实际检测了一张大小为12M的表通过客户端备份,不加-C参数用了34秒,加了参数之后用了21秒

--compatible=name 产生与其他数据库或者老版MySQL兼容的备份文件,可用的值有ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options。可同时使用多个以逗号分隔的值。

注意:需要MySQL服务器版本4.1.0或更高版本,使用方法如下图

--compact 相当于一个参数包,其中包含了--skip-add-drop-table,--skip-add-locks,--skip-comments,--skip-disable-keys,--skip-set-charset

-a, --create-options   在CREATE TABLE语句中包括所有MySQL特性选项(默认为打开状态),可以使用--skip-create-options禁用

使用--skip-create-options后的建表语句如下图所示

可以看到后者没有设置默认的引擎和字符集

-B, --databases 备份多个数据库,选项后跟多个库名。备份文件中会包含USE db_name。

--default-character-set=设置默认字符集,默认值为utf8

-e, --extended-insert   将多行insert语句合并成一行,默认开启,这样插入的速度较快,可以使用--skip-extended-insert禁用

--fields-terminated-by=name   指定字段分隔符,需要与 -T, --tab=name联合使用

-T, --tab=name   为给定的每个表创建以制表符分隔的文本文件路径。 (创建.sql和.txt文件。)注意:这只适用如果mysqldump在与mysqld相同的机器上运行服务器。

这时会生成两个文件,一个.sql文件(指定数据结构的sql语句),一个.txt文件(指定要求的数据文本文件)

--fields-enclosed-by=name 指定文本限定符,用法同--fields-terminated-by=name

fields-optionally-enclosed-by用法和作用同fields-enclosed-by,二者的区别是fields-optionally-enclosed-by作用在含有文本的类型中,对纯数字无影响,下图可以看出二者的区别

fields-enclosed-by                                                                         fields-optionally-enclosed-by

                                                                 

--fields-escaped-by=name   指定转义字符,用法同上

--lines-terminated-by=name 指定换行符,用法同上

-F, --flush-logs  导出之前刷新日志,假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。

从上图可以看到第一遍执行的时候报错,这是因为执行flush需要reload权限,加上相应的权限即可成功执行 ,这时候日志刷新了一份,这种操作是为了在备份之后有更新操作的时候,增量的时候能够更容易找到起始位置

这样操作就会刷新两个日志

--flush-privileges   在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。

-f, --force  遇到sql报错继续执行

--hex-blob  使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB,先插入一条二进制数据,然后观察加参数和不加参数的区别

这是不加参数的效果

这是加参数的效果

 可以看到最后一条二进制数据后者显示了出来

--ignore-table  不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2

–insert-ignore  在插入行时使用INSERT IGNORE INTO语句.(个人对INSERT IGNORE INTO的理解是忽略并纠正当前错误,如果无法纠正则跳过当前语句)

 如上图所示,主键冲突的那一条信息跳过了,数据过长的那一条信息被修正为长度20,期间只有warning,并没有报错

–max_allowed_packet  服务器发送和接受的最大包长度。

–lock-all-tables,  -x  提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭–single-transaction 和–lock-tables 选项。

–log-error  附加警告和错误信息到给定文件

 

–net_buffer_length  TCP/IP和socket连接的缓存大小。

–no-autocommit   使用autocommit/commit 语句包裹表。

 

可以看到这个处理是将自动提交关闭,在插入之后再手动提交

–no-create-db,  -n  只导出数据,而不添加CREATE DATABASE 语句,要结合--databases或者备份全库的时候使用

-t, --no-create-info  不写创建表的信息

-d, --no-data  不写表的具体数据,只有建表语句

-N, --no-set-names  相当于 --skip-set-charset.

--opt  等同于–add-drop-table,  –add-locks, –create-options, –quick, –extended-insert, –lock-tables,  –set-charset, –disable-keys 该选项默认开启,  可以用–skip-opt禁用.

–order-by-primary  根据主键进行排序,如果没有主键就根据第一个唯一键进行排序

--protocol=name  使用的连接协议,包括:tcp, socket, pipe, memory.

-q, --quick   不缓冲查询,直接导出到标准输出。默认为打开状态,使用–skip-quick取消该选项。

-Q, --quote-names     用反引号(`)引用表和列名。(默认为on;使用--skip-quote-names禁用。)

--replace           用REPLACE替代INSERT INTO.(REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。)

--add-drop-trigger  创建触发器之前加删除触发器语句

--add-drop-table  创建表之前加删除表语句(默认开启,用--skip-add-drop-table禁用)

--add-drop-database  创建数据库之前加删除数据库语句

–set-charset  添加'SET NAMES  default_character_set'到输出文件。默认为打开状态,使用–skip-set-charset关闭选项。

--skip-opt     禁用–opt选项.

--socket,-S   指定连接mysql的socket文件位置,默认路径/tmp/mysql.sock

--dump-date   将导出时间添加到输出文件中。默认为打开状态,使用--skip-dump-date关闭选项。

--tables 覆盖--databases (-B)参数,指定需要导出的表名。

test是数据库名称,a,e是表的名称

 我们看上图的报错是找不到表test2,正常来说-B参数是会把test,test2都识别成数据库名称的,所以这里-B参数不起作用,即--tables 覆盖--databases (-B)参数

--triggers 导出触发器。该选项默认启用,用--skip-triggers禁用它。

--tz-utc  在导出顶部设置时区TIME_ZONE='+00:00' ,以保证在不同时区导出的TIMESTAMP 数据或者数据被移动其他时区时的正确性。(默认开启,用--skip-tz-utc禁用)

--verbose, --v  输出多种平台信息。

--version, -V  输出mysqldump版本信息并退出

--where, -w  只转储给定的WHERE条件选择的记录。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。

 上图的写法报错了,包含了空格等,所以需要用引号括起来,如下图写法

--xml, -X  导出XML格式.

--plugin_dir 客户端插件的目录,用于兼容不同的插件版本。

--default_auth 客户端插件默认使用权限。

--routines, -R  导出存储过程以及自定义函数。

--all-tablespaces , -Y   导出全部表空间。(向表转储添加创建NDB表使用的任何表空间所需的所有SQL语句。 此信息不包含在mysqldump的输出中。 此选项目前仅与MySQL Cluster表相关,MySQL表中不支持这些表。)

--no-tablespaces , -y   不导出任何表空间信息。

--apply-slave-statements  在'CHANGE MASTER'前添加'STOP SLAVE',并且在导出的最后添加'START SLAVE'。防止主从环境导致数据变化

--delete-master-logs  备份后删除主服务器上的日志。 自动启用--master-data。(这个参数不太理解,测试发现日志并没有删除,而且备份文件里也没有建表和插入数据的脚本,不过从日志的刷新来看确实是启用了--master-data)

--dump-slave[=#]

该选项将导致主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增加说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。(在从执行)

要求备份用户额外具备 SUPER, LOCK TABLES, REPLICATION CLIENT权限

--master-data[=#]  该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。(在主执行)

--single-transaction   该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。

--set-gtid-purged[=name]  用于主从备份,存在on,off,auto三个值,具体情况后续补充,这个参数不是很懂

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值