mysqldump命令使用详解
mysqldump是一个数据库备份程序
用法:mysqldump [options] [db_name [tbl_name ...]]
描述:mysqldump是一个客户端逻辑备份的工作,备份的SQL文件可以在其他MySQL服务器上进行还原。
如需备份,则至少需要对该表的select权限,需要备份视图则需要改账户具有SHOW VIEW权限,触发器需要TRIGGER。如需锁表,则不可使用--single-transaction选项。其他权限暂未列出。
如需还原,则需要对应的执行权限,如create表,则需要对该库的create权限。
mysqldump导出可以包括ALTER DATABASE与相关更改,其中包括导出元数据、更改字符编码,在导入对应文件时,相应的权限更改也会发生影响。
如果在服务器上备份的表均为MyISAM,也可以使用mysqlhotcopy来完成任务。
注意:如果在Windows环境下使用默认shell,则重定向输出的文件为UTF-16编码。 shell> mysqldump [options ] > dump.sql
然而,UTF-16是一个不允许被连接的字符集(参见10.1.5单元,‘Connection Character Sets and Collations’),所以导出文件不能被正常加载使用。为了解决这个问题,使用--result-file选项,创建ASCII格式文件: shell> mysqldump [options] --result-file=dump.sql
从性能和伸缩性考虑,mysqldump的优势包括:在输出之前可以很方便的查看或编辑文件,你还可以克隆数据库与DBA的工作,或者将生产环境下的数据进行微小测试。这不是作为快速备份或可伸缩性很强的方案。即针对不同大小的数据需要安排合理时间,在需要还原时速度并不快,因为需要重新进行I/O、创建索引等。
对于大量数据来说,物理备份可能更为合适,因为他可以快速还原。
·如果你的表以Innodb引擎为主,可以考虑使用MySQL的mysqlbackup命令。因为他提供了最好的Innodb备份:它也可以备份其他如MyIsAM与其他存储引擎;提供了更多的备份参数进行选择。详情见手册 25.2 “MySQL Enterprise Backup Overview”
·如果你的表以MyISAM引擎为主,可以考虑使用mysqlhotcopy来替代,它可能比mysqldump表现更为好,详情见mysqlhotcopy手册。
mysqldump可以行级导出数据,或者也可以将整个表载入内存一次性导出,如果将所有数据导入内存可能会面临内存缓冲区不够的问题。如果要行级导出数据,使用--quick选项(或者--opt,它支持--quick)。--opt选项是默认选项,所以为了保证内存缓冲区,使用--skip-quick。
如果你使用高版本的mysqldump来备份一个低版本的MySQL服务器中的数据,使用--skip-opt代替--opt或者-- extended-insert选项。
关于mysqldump的更多信息,要参照手册7.4单元“Useing mysqldump for Backups” 这里列出几个常用选项:备份一个或多个表,备份一个完整的数据库,备份一台MySQL服务器上所有数据库
>shell mysqldump [options] db_name [tbl_tables ...]
>shell mysqldump [options] --databases db_name ...
>shell mysqldump [options] --all-databases
备份整个数据库时,不要使用name与tables,直接指定db_name 或使用 --databases 或 --all-databases
mysqldump默认不会备份INFORMATION_SCHEMA与performance_schema数据库。如果要备份这些内容,需要在指定使用--skip-lock-tables选项。你也可以指定使用--databases时指定数据库名称。在MySQL5.5之前,及时你指定了,mysqldump也不会备份上述内容。
mysqldump不会备份performance_schema数据库。
在MySQL5.5.25版本之前,mysqldump不会备份mysql库的general_log 或 slow_query_log表。在5.5.25,备份文件包括重建指令。表中log内容不会备份。
mysqldump也不会备份MySQL集群nbinfo数据库信息。
可以使用mysqldump --help命令查看选项列表。
一下有一些选项组的缩写:
·使用--opt指令相当于--add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, a和 --set-charset,以上这些选项是默认的,因为--opt是默认使用的选项。
·使用--compact相当于同事使用--skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, 和 --skip-set-charset。
为了不影响选项组其他选项,使用该组的 --skip-xxx from(--skip-opt或--skip-compack)他也可以选择选项组内的一些选项,例如一下:
·如果需要选择--opt选项组不生效的选项,使用--skip加选项。为了避免写入内存,使用--opt --skip-extend-insert --skip-quick(一般 --skip-extend-insert --skip-quick默认禁用,因为--opt默认启用)
· 逆转——选择除了索引禁用所有功能和表锁定,使用--skip-opt --disable-keys --lock-tables
当需要启用或禁止选项组中某些特定的选项,指定就显得十分重要了,因为这些选项会在进程运行时始终生效。比如说,--disable-keys --lock-tables --skip-opt将不会作用。这就像--skip-opt作用于他自身。
接下来说一下mysqldump的选项:
· --help:显示帮助信息并退出程序
· --add-drop-databases:在CREATE DATABASE之前写入drop databases。这个选项通常是配合--all-databases或--database使用,因为CREATE DATABASE语句执行时至少选定一个选项。
· --add-drop-table:在每一条CREATE TABLE之前写入DROP TABLE命令
· --add-drop-tigger:在每一条CREATE TIGGER之前写入DROP TIGGER。注意:这个选项只有mysqldump作为MySQL集群时提供。
· --add-locks:在备份时进行锁表,备份完释放表锁。这样可以避免快速写入数据造成脏读。
· --all-databases, -A :备份所有库中的所有表,效果等同于--database 后跟随所有库名。
· --all-tablespaces, -Y:使用NDBCLUSTER表来为所有的表备份语句添加表空间。这些信息是不包含在,mysqldump的输出。这个选项只有MySQL集群目前相关表。
· --allow-keywords:允许使用关键词作为列名,但是会在列名之前加上表名作为前缀。
· --apply-slave-statements:在MySQL5.5.3之后添加的选项,在从服务器上使用--dump-slave,在备份时停止从主服务器上备份数据。
· -- bind-address=ip_address:在一台主机上有多个网卡设备时,选择其中一块指定网卡连接MySQL服务器。这个选项仅支持mysqldump版本支持的MySQL集群,在5.5稳定版中还不支持。
· --character-sets-dir=dir_name:文件夹将使用安装数据库的字符集。
· --comments,-i:默认会将MySQL版本,服务器版本,主机信息等添加到备份文件中。如果不需要这些信息,可以使用--skip-comments。
· --compact:输出更多的相关信息,这个选项支持使用--skip-drop-tables --skip-add-locks --skip-comments --skip-disable-keys --skip-set-charset选项。
· --compatible=name:生成兼容其他版本数据库的备份文件。name可以为ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options.如果需要填写多个时,使用‘,’分隔,备份文件会针对不同版本进行制定的SQL模式。
这个选项并不能保证与其他服务器的兼容性。它只允许那些当前可用的SQL模式值进行转储输出更多的兼容。例如,-compatible=ORACLE不兼容数据类型映射到oracle类型或使用Oracle语法置评。
此选项要求MySQL版本4.1.0以上
· --complete-insert,-c:在INSERT语句时包含列名。
· --compress,-C:在客户端与服务器都支持的压缩算法中,选择压缩数据进行通信。
· --create-options:在CREATE TABLE语句包含所有表选项。
· --database,-B:备份制定数据库。一般来说,mysqld对待name参数时,第一个参数作为数据库名,紧随其后的作为表名。但是在使用这个选项时,会将所有name参数作为数据库名进行备份。在每一个数据库备份前都会添加CREATE DATABASE 与 USE指令。
· --debug=[debug_options],-# [debug_options] :写入debug日志,常用debug_options使用字符串 d:t:o,filen_ame,默认值为d:t:o,/tmp/mysqldump.trace
· --debug-check:在程序退出时打印debug信息。
· --debug_info:在程序退出时打印内存、CPU使用状态至debug信息中。
· --default-auth=plugin:对客户端身份验证插件的使用提示。此特性5.5.9开始加入。
· --default- character-set=charset_name:使用charset_name作为字符集。
· -- defaults-extra-file=file_name:读取选项文件作为全局选项(Unix环境),并在用户选项之前生效。如果文件不存在或由于权限致使无法访问,则会产生错误。在MySQL5.5.8之前必须使用绝对路径。5.5.8之后可以使用相对路径。
· --defaults-file=file_name:仅使用默认选项文件。如果文件不存在或由于权限致使无法访问,则会产生错误。在MySQL5.5.8之前必须使用绝对路径。5.5.8之后可以使用相对路径。
· --defaults-group-suffix=str:Read不仅使用通常的组名,而且也支持定义组别名。举例:mysqldump通常会读取[client]与[mysqldump]的组。如果给出了--defaults-group-suffix=str,mysqldump也会读取[client_ohter]与[mysqldump_other]组。
· --delayed-insert:在INSERT时会使用INSERT DELAYED
· --delete- mastelogs:在主从架构中,会使用PURGE BINARY LOG指令来删除主服务器中的从服务器备份的二进制日志。这个选项会自动启用 --master-data
· --disable-keys,-K:在每一个表中的INSERT都会使用 /*!40000 ALTER TABLE tbl_name DISABLE KEYS */ /*!40000 ALTER TABLE tbl_name ENABLE KEYS */包起来。这样可以使得还原时速度更快,因为索引信息在所有INSERT操作之后才会建立,这个选项只会影响MyISAM表的 nonunique 索引,对其他引擎不生效。
· --dump-date:如果给出了--comments选项,mysqldump会在备份文件的结尾处添加-- Dump completed on DATE。然而,由于在备份时,会消耗时间所以为产生不同的日期。--dump-date与--skip-dump-date控制如何记录日期,默认为--dump-date,日期包含在 comment中,--skip-dump-date支持阻止时间打印。
· --dump-slavel=[value]:这个选项与--master-data相似(除包含主从关系外),它会引起备份输出至从服务器的二进制日志(包含有CHANGE MASTER TO指令)主服务器则会替换。
--dump-slave:协调主从服务器就像使用--master-data选项。但是会引起--master-data失效。这个选项的值像是挂起--master-data的行为(不传入值或者1,CHANGE MASTER TO,设置为2会导致SQL被包起来)而且与之具有相同效应。这个选项会引起mysqldump在备份前停止停止slave SQL线程,而后重启。也可以结合--dump-slave --applay-slave-statements 与 --include-master-host-port使用。此特性在MySQL5.5.3被引入。
· --events,-E:使用事件调度器完成备份,但是需要数据库相关权限。
· -- extended-insert, -e:会使用列表写入INSERT,即一条语句插入多个值,这样会是备份文件更小。
· --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=...:这些选项配合使用--tab选项卡而且要具备对应含义的FIELDS列作为LOAD TATA INFILE
· --first-slave:已弃用!使用--lock-all-tables代替。 此指令在MySQL5.5.3被启用。
· --flush-logs,-F:在备份前刷新MySQL服务器的日志,此选项需要RELOAD权限。如果你在--all-databases情景下使用此选项,则会在每个数据库时刷新logs。 --lock-all-tables, --master-data, or (as of MySQL 5.5.21) --single-transaction时:日志只会被刷新一次,执行时会加表锁。如果你想在备份时刷新日志,--lock-all-tables, --master-data, or --single-transaction.配合此选项使用。
· --flush-privileges:在备份文件中添加执行FLUSH PRIVILEGES指令。如果你需要备份mysql库来回复某些权限时应当使用此选项。
· --force,-f:及时在备份表出现错误时依然继续执行。这个选项的使用场景之一是:在备份时出现错误,因为表已被删除。如果不使用此选项,mysqldump则会存在错误信息。如果使用,则会将错误信息打印出来后继续执行SQL指令。
· --enable-cleartext-plugin:开启cleartext插件。此特性在MySQL5.5.7时引入。
· --host=name,-h host_name:从给出的主机名备份,如果没给出,则默认为localhost
· --hex-blob:包含有二进制信息的列将会由十六进制输出(比如,‘abc’,将会输出为 0x616263,受影响的数据类型:BINARY, VARBINARY, the BLOB types, and BIT
· --include-master-host-port:在从服务器上的CHANGE MASTER TO 指令将会由--dump-slave选项备份,MASTER_HOST,MASTER_PORT指TCP/IP端口。此特性在MySQL5.5.3引入
· --ignore-table=db_name.tbl_name:忽略要被备份的表,如果忽略多个则需要使用多次此选项,此选项还可以忽略VIEW。
· --insert-ignore:使用INSERT IGNORE 代替INSERT
· --lines-terminated-by=...:这个选项在LOAD DATA INFILE使用对应意义的--tab作为LINES列
· --lock-all-tables, -x:在备份时添加全局锁。此选项会自动关闭--single-transaction and --lock-tables.
· --lock-tables, -l:对于每个数据库,都会在备份之前锁所有表。在MyISAM表会施加READ LOCAL。对于Innodb这种带有事物的引擎,--single-transaction可能是更好的选择。
· --log-error=file_name:将错误记录到指定file_name,默认不记录。
· --master-data[=value]:使用此选项可以将主服务器转储为备份文件,使用另外一台服务器还原时依然可以作为主服务器。但是这些服务器应该是从服务器还原之后再还原主服务器。如果选项值是2,CHANGE MASTER TO 被编写为一个SQL注释,因此只是信息;它转储文件还原时没有影响。如果选项值是1,该声明是没有写评论和生效当转储文件重新加载。如果没有指定选项值,默认值是1。此选项要求具备 RELOAD而且要开启二进制日志。
--master-data选项会默认关闭--lock-tables,而且默认打开 --lock-all-tables,但是 --lock-all-tables除外。在一种情况下:在开始备份前会需要一些时间添加全局读锁。如论如何,logs会详细记录dump时刻。
如果备份的主服务器含有从服务器时,也可能建立一个从服务器。在MySQL5.5.3或以上版本时,你可以使用--dump-slave,但是如果同时存在时会覆盖--master-data选项。在MySQL5.5.3之前,使用如下规则来备份:
1.停止从服务器获取当前状态
mysql> STOP SLAVE SQL_THREAD;
mysql> SHOW SLAVE STATUS;
2.从SHOW SLAVE STATUS指令输出的内容中与主服务器对应的新从服务器的二进制日志应该开始替换Relay_Master_Log_File and Exec_Master_Log_Pos表示file_name与file_pos
3.备份从服务器
shell> mysqldump --master-data=2 --all-databases > dumpfile
4.重启从服务器
mysql> START SLAVE;
5.在新的从服务器上导入数据
shell> mysql < dumpfile
6.在新的从服务器上设置主服务器信息
mysql> CHANGE MASTER TO
-> MASTER_LOG_FILE = 'file_name', MASTER_LOG_POS = file_pos;
CHANGE MASTER TO指令可能还需要其他参数,比如MASTER_HOST指向当前从服务器对应的主服务器。添加其他必要参数
· --no-autocommit:在执行INSERT时关闭自动提交,即autocommit = 0 ,使用 COMMIT
· --no-create-db, -n:在给出--databases 或 --all-databases选项时,不执行CREATE DATABASE 指令
· --no-create-info, -t:在创建备份的表示,不执行CREATE TABLE。注意:不过此选项不排除mysqldump时会在日志文件中记录文件组与表空间,可是,你可以使用--no-tablespaces来完成。
· --no-data, -d:不会在表中记录信息。这就在你只想CREATE TABLE时就很有用了(比如,只想备份表结构)
· --no-defaults:不读取选项文件,如果程序因为读取未知文件而失败可以使用此选项避免读取。
· --no-set-names, -N:此选项与--skip-set-charset.效果相同。
· --no-tablespaces, -y:CREATE LOGFILE GROUP与CREATE TABLESPACE指令不会被写进备份文件。
· --opt:相当于 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset,它提供了一个快速备份和还原的功能。
· --order-by-primary:备份表时会根据主键或第一个不重复的索引排序。如果索引存在,这就使得从一个MyISAM表向Innodb表导入时很方便了,不过这也会使备份时需要计算的时间更长。
· --password[=password], -p[password]:连接数据库的密码。如果使用短标签时,在密码与p之间不要有空格,如果你省略了password的值,mysqldump会提示输入。为了安全起见,当然你也可以在选项文件中提供,避免使用时输入。
· --pipe, -W:在Windows中,是通过管道连接MySQL服务器。这个选项提供了只有MySQL服务器提供的管道连接。
· --plugin-dir=dir_name:你插件的文件夹。如果--default-auth时,mysqldump不会去寻找。
·--port=port_num, -P port_num:TCP/IP使用的端口号。
· --print-defaults:在输出的文件中打印程序名与选项。
· --protocol={TCP|SOCKET|PIPE|MEMORY}:使用此选项你可以指定传输方式。
· --quick, -q:在备份数据量比较大的表时有用。会将数据读入内存,在输出完成之前会存在内存缓冲区。
· --quote-names, -Q:会将逃逸字符进行转义,“‘” '"'会换位'`',如果是ANSI_QUOTES SQL模式支持的话,会转为‘"‘’,此选项默认启动,如果需要关闭,可以使用--skip-quote-names。
· --replace:使用REPLACE代替INSERT。
· --result-file=file_name, -r file_name:直接输出到指定的文件。创建结果文件及其之前的内容覆盖,即使发生错误而生成转储。这个选项应该在Windows上使用,以防止换行符“\ n”字符被转换为“\ r \ n”回车/换行符序列
` --routines, -R:包括存储程序(过程和函数)的倾倒数据库输出。这个选项需要mysql.proc表的SELECT权限。使用,例程生成的输出包含创建过程和创建函数语句创建例程。然而,这些语句不包括属性,如例程创建和修改时间戳,所以当例程.重新加载,创建时间戳等于重新加载时间。如果你需要创建例程和原来的时间戳属性,不使用,例程。相反,转储和重载mysql的内容。proc直接表,使用MySQL账户有合适的MySQL数据库特权。
· --set-charset:在输出的文件中添加SET NAMES 指定,此选项是默认的,如需关闭可使用--skip-set-charset。
· --shared-memory-base-name=name:在Windows上,所使用的共享内存的名字,使用共享内存连接到本地服务器。默认值是MYSQL。共享内存名称是区分大小写的。服务器必须启动——共享内存选项来启用共享内存连接。
· --single-transaction:这个选项设置事务隔离模式可重复读取和发送一个开始事务服务器的SQL语句,并把数据。是有用的只有InnoDB等事务性表,因为它转储的一致状态数据库事务开始时发布不阻止任何应用程序。当使用这个选项,你应该记住,只有InnoDB表在一个一致的状态。例如,任何MyISAM表或内存倾倒在使用这个选项可能仍然改变状态。
——单独的事务转储是在过程,以确保一个有效的转储文件和二进制日志坐标)(正确的表内容,没有其他的连接应使用以下语句:ALTER table,创建表,删除表,重命名表,截断。目的是为了保持一致性。这也会添加表锁。
此选项支持MySQL集群,结果不能保证因为NDBCLUSTER一致存储引擎只支持READ_COMMITTED事务隔离级别。你应该总是使用NDB备份和恢复。
在备份很大的表时,结合--quick与此选项使用。
· --skip-comments:参照--comments
· --skip-opt:参照--opt。
· --socket=path, -S path:在与本机通信时,Unix系统会基于Unix sock file进行通信,Windows基于pipe。
· --ssl*:使用ssl加密通信数据
· --tab=dir_name, -T dir_name:产生制表符分隔的文本格式的数据文件。对于每个转储表,,mysqldump创建一个tbl_name。sql文件,其中包含CREATE TABLE语句创建表,和服务器tbl_name写道。txt文件,其中包含数据的选项值是编写的文件的目录。
此选项只应该在MySQL服务器备份时使用。
· --tables:--databases后使用,此选项会使mysqldump将之后参数视为表名。
· --triggers:会在导出每个表时都导出触发器,不过需要具有TIGGER的权限,此选项默认启用。
· --tz-utc:默认启用,禁用可以使用--skip-tz-utc。此为时区信息。
· --user=user_name, -u user_name:连接MySQL服务器使用的用户名
· --verbose, -v:verbose模式,此模式会输出更多有关程序的信息。
· --version, -V:显示版本信息并退出程序。
· --where='where_condition', -w 'where_condition':备份时使用where条件
· --xml, -X:输出为xml格式