使用mysqldump导出数据库

本文详细介绍了MySQL数据库备份工具mysqldump的使用方法及常见参数,包括如何进行全量备份、增量备份及特定条件下的数据导出等,并通过实例展示了多种备份场景的应用。

    mysqldump是mysql用于转存储数据库的客户端程序。它主要产生一系列的SQL语句,可以封装到文件,该文件包含有所有重建您的数据库所需要的SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等。可以用来实现轻量级的快速迁移或恢复数据库。是mysql数据库实现逻辑备份的一种方式。本文描述了mysqldump的一些重要参数以及给出了相关示例供大家参考。

 

1、获取mysqldump的帮助信息
  [root@SZDB ~]# mysqldump --help|more
  mysqldump  Ver 10.13 Distrib 5.6.12, for Linux (x86_64)
  
  #以下为MySQL dump调用的几种常用方式
  Dumping structure and contents of MySQL databases and tables.
  Usage: mysqldump [OPTIONS] database [tables]
  OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
  OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
  
  #如果没有指定任何表或使用了---database或--all--database选项,则转储整个数据库
                 
  --opt           Same as --add-drop-table, --add-locks, --create-options,
                   --quick, --extended-insert, --lock-tables, --set-charset,
                   and --disable-keys. Enabled by default, disable with
                   --skip-opt.
                
  -q, --quick           Don't buffer query, dump directly to stdout.  
                            (Defaults to on; use --skip-quick to disable.)
  #以上2个参数未使用的情况下,在转储结果之前会把全部内容载入到内存中,对于较大的数据库转储将严重影响性能。
  #缺省情况下这2个参数为开启状态。有些类似于Oracle的绕过PGA而直接写direct write。
              
  --skip-opt        Disable --opt. Disables --add-drop-table, --add-locks,
                      --create-options, --quick, --extended-insert,
                      --lock-tables, --set-charset, and --disable-keys.             
  #skip-opt与前2个参数相反,在转储之前先load到内存中。
  
  --compatible=name   Change the dump to be compatible with a given mode. By
                        default tables are dumped in a format optimized for
                        MySQL. Legal modes are: ansi, mysql323, mysql40,
                        postgresql, oracle, mssql, db2, maxdb, no_key_options,
                        no_table_options, no_field_options. One can use several
                        modes separated by commas. Note: Requires MySQL server
                        version 4.1.0 or higher. This option is ignored with
                        earlier server versions.
  
  #产生与其它数据库系统或旧版本MySQL服务器相兼容的输出。用于跨数据库,跨版本之间的迁移。
  #其值可以为ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options或者no_field_options。
  #如果要使用多个值,用逗号将它们隔开。该选项不能保证同其它数据库服务器之间的完全兼容。如Oracle的数据类型等。
                       
  --compact           Give less verbose output (useful for debugging). Disables
                        structure comments and header/footer constructs.  Enables
                        options --skip-add-drop-table --skip-add-locks
                        --skip-comments --skip-disable-keys --skip-set-charset.
  #该选项使得输出的文件更小,启用后等用于使用一些skip项等。
  
  -B, --databases     Dump several databases. Note the difference in usage; in
                        this case no tables are given. All name arguments are
                        regarded as database names. 'USE db_name;' will be
                        included in the output.
  #该选项一次导出多个数据库所有名字参量看作数据库名,更重要的是会生成CREATE DATABASE IF NOT EXISTS dbname 
  
  --default-character-set=name
                        Set the default character set.
  #设置导出脚本的字符集,未指定的情况下为UTF8。
  
  --flush-privileges  Emit a FLUSH PRIVILEGES statement after dumping the mysql
                        database.  This option should be used any time the dump
                        contains the mysql database and any other database that
                        depends on the data in the mysql database for proper
                        restore.
  #在dump mysql数据库以及依赖于mysql数据库恢复时建议使用该选项生成FLUSH PRIVILEGES语句
  
  -F, --flush-logs    Flush logs file in server before starting dump. Note that
                        if you dump many databases at once (using the option
                        --databases= or --all-databases), the logs will be
                        flushed for each database dumped. The exception is when
                        using --lock-all-tables or --master-data: in this case
                        the logs will be flushed only once, corresponding to the
                        moment all tables are locked. So if you want your dump
                        and the log flush to happen at the same exact moment you
                        should use --lock-all-tables or --master-data with
                        --flush-logs.
  #在启动dump前会flush日志,此方式可以用于实现增量备份
                                                                                        
  -d, --no-data       No row information.
  #不输出数据行,仅导出结构
                     
  -f, --force         Continue even if we get an SQL error.                                           
  #在碰到错误时,依旧强制dump
  
  --master-data[=#]   This causes the binary log position and filename to be
                        appended to the output. If equal to 1, will print it as a
                        CHANGE MASTER command; if equal to 2, that command will
                        be prefixed with a comment symbol. This option will turn
                        --lock-all-tables on, unless --single-transaction is
                        specified too (in which case a global read lock is only
                        taken a short time at the beginning of the dump; don't
                        forget to read about --single-transaction below). In all
                        cases, any action on logs will happen at the exact moment
                        of the dump. Option automatically turns --lock-tables
                        off.
  #添加二进制日志位置到输出。1表示输出change master命令,2则注释输出change master命令。
                       
  -R, --routines      Dump stored routines (functions and procedures).
  #导出函数和过程以及触发器,缺省情况下,这些不会被导出
  
  -t, --no-create-info
                        Don't write table creation info.
  #不生成建表语句
                       
  --single-transaction
                        Creates a consistent snapshot by dumping all tables in a
                        single transaction. Works ONLY for tables stored in
                        storage engines which support multiversioning (currently
                        only InnoDB does); the dump is NOT guaranteed to be
                        consistent for other storage engines. While a
                        --single-transaction dump is in process, to ensure a
                        valid dump file (correct table contents and binary log
                        position), no other connection should use the following
                        statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
                        TRUNCATE TABLE, as consistent snapshot is not isolated
                        from them. Option automatically turns off --lock-tables.
  #创建一致性快照,仅仅针对innodb引擎
  #不能存在其他操作:ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE,关闭--lock-tables。
                       
  -w, --where=name    Dump only selected records. Quotes are mandatory.
  #使用where子句只导出符合条件的记录
  # Author : Leshami
  # Blog   :
http://blog.csdn.net/leshami

 

2、dump的相关示例      
  备份单个数据库
  shell> mysqldump -uroot -pxxx sakila >sakila.sql
  
  带压缩方式备份数据库
  shell> mysqldump -uroot -pxxx sakila |gzip >sakila.sql.gz
  
  备份数据库上的特定表
  shell> mysqldump -uroot -pxxx sakila actor >sakila_actor.sql
  
  备份表上特定的记录
  shell> mysqldump -uroot -pxxx sakila actor -w "first_name='NICK'" >sakila_actor_row.sql
  
  备份数据库的结构
  shell> mysqldump -uroot -pxxx sakila --no-data >sakila_structure.sql
  
  同时备份多个数据库
  shell> mysqldump -uroot -pxxx --database sakila tempdb test >multidb.sql
  
  备份服务器上的所有数据库
  shell> mysqldump -uroot -pxxx --all-databases --opt --compact --flush-privileges >alldb.sql
  
  只导出数据库中的存储过程,函数,触发器
  shell> mysqldump -uroot -pxxx sakila --no-create-db --no-data --no-tablespaces --no-create-info --routines >sakila.sql
  
  全量备份与增量备份
  #下面首先对数据库做全量备份并在备份前flush日志
  shell> mysqldump -uroot -pxxx --single-transaction --flush-logs --master-data=2 sakila >sakila_full.sql
  #假定备份时flush的日志为mysql-bin.000004,则使用如下方式恢复
  shell> mysql -uroot -pxxx < sakila_full.sql
  shell> mysqlbinlog mysql-bin.000004 | mysql -uroot -pPwd

 

3、其它
a、对比--database与直接数据库备份,如下,也就是说使用--database会生成建库语句
  shell> mysqldump -uroot -pxxx --database tempdb >tempdb1.log
  shell> mysqldump -uroot -pxxx --opt tempdb >tempdb2.log
  shell> grep DATABASE tempdb1.log
   CREATE DATABASE /*!32312 IF NOT EXISTS*/ `tempdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
  shell> grep DATABASE tempdb2.log

b、性能相关
  使用--quick或者--opt有助于加快dump的过程,减少dump所需的时间。
  mysqldump不适用于大型数据库备份与恢复,速度慢,不支持并行,其次SQL重放将耗用大量的I/O。对于这种情形,建议使用物理备份方式。
  如果mysql数据库中使用的存储引擎主要为innodb或myisam,或者2者的混合,可以考虑使用mysql企业版更高效的mysqlbackup工具。
  如果mysql数据库中主要的表为myisam,更好的性能建议使用mysqlhotcopy方式。
  详细参考:
http://dev.mysql.com/doc/refman/5.6/en/mysqldump.html

鹏城DBA总群

 

<think>我们正在处理用户的问题:在使用mysqldump导出MySQL数据库时设置导出文件的编码格式。 根据用户的问题,我们需要提供如何设置mysqldump导出文件的编码格式的方法。 参考引用: 引用[2]提到了使用mysqldump命令导出数据,但没有直接提到设置编码格式。 其他引用也没有直接提到设置编码,但我们可以结合mysqldump的官方文档和常见用法来回答。 实际上,mysqldump有两个与编码相关的选项: 1. `--default-character-set`:指定导出使用的字符集。这会影响导出SQL文件中的字符集设置和实际存储的数据的转义方式。 2. 另外,我们还可以通过设置客户端的字符集来影响导出。 另外,我们还可以在导出后通过工具转换文件编码,但这不在mysqldump命令本身。 因此,我们主要使用`--default-character-set`选项来设置导出的字符集。 例如,如果我们想将数据库`mydb`导出为UTF8编码,我们可以使用mysqldump --default-character-set=utf8 -u username -p mydb > mydb.sql 注意:这个选项指定的是导出SQL文件使用的字符集。它也会在导出SQL文件中设置`SET NAMES`语句。 另外,如果数据库中的数据是以其他字符集存储的,比如latin1,而我们要导出为utf8,那么mysqldump会在导出时进行转换。 但是,需要注意的是,如果数据库中的数据已经是utf8,那么指定`--default-character-set=utf8`可能不是必须的,因为默认情况下mysqldump使用utf8(在MySQL 5.7.28及以后版本,默认字符集从latin1改为了utf8mb4)。不过,为了确保导出文件的编码符合要求,最好明确指定。 此外,我们还可以在导出使用`--set-charset`选项,它会在导出SQL文件中添加`SET NAMES default_character_set`语句。默认情况下,这个选项是启用的。如果我们指定了`--default-character-set`,那么`--set-charset`会自动添加相应的SET NAMES语句。 如果我们不想在导出文件中包含任何设置字符集的语句,可以使用`--skip-set-charset`。 所以,总结一下: 要设置导出文件的编码,主要使用`--default-character-set`选项。 另外,我们也可以使用操作系统的重定向并配合iconv等工具进行编码转换,但这属于后处理。 根据用户的问题,我们只关注在mysqldump命令中设置编码。 因此,我们可以这样回答: 在mysqldump命令中,通过`--default-character-set`选项来指定导出文件的编码。例如,导出为UTF8编码: ```bash mysqldump --default-character-set=utf8 -u [username] -p [database_name] > output.sql ``` 请将`[username]`替换为数据库用户名,`[database_name]`替换为要导出数据库名。执行命令后,系统会提示输入密码。 注意:`--default-character-set`的值应该与数据库中的字符集兼容,否则可能会出现乱码。 如果数据库使用的是utf8mb4(支持4字节的UTF8,如表情符号),那么使用utf8mb4作为字符集: ```bash mysqldump --default-character-set=utf8mb4 -u [username] -p [database_name] > output.sql ``` 这样,导出的文件就会使用utf8mb4编码。 另外,我们还可以通过添加`--hex-blob`选项来避免二进制数据(如BLOB类型)在导出时出现编码问题,但这不是必须的,除非你的数据库中有二进制数据。 最后,我们生成相关问题。</think>在使用 `mysqldump` 导出 MySQL 数据库时,可以通过以下方式设置导出文件的编码格式: ### 方法一:使用 `--default-character-set` 参数 在 `mysqldump` 命令中直接指定字符集: ```bash mysqldump -u [用户名] -p --default-character-set=utf8mb4 [数据库名] > 导出文件.sql ``` - **`utf8mb4`**:推荐用于支持完整的 Unicode 字符(如表情符号) - 其他常用字符集:`utf8`、`latin1`、`gbk` 等 - 示例: ```bash mysqldump -u root -p --default-character-set=utf8mb4 mydb > mydb_utf8.sql ``` ### 方法二:导出后转换编码(备用方案) 如果已导出文件需要转换编码,可使用 `iconv` 工具: ```bash iconv -f 原编码 -t 目标编码 原文件.sql > 新文件.sql ``` - 示例(转换 GBK 到 UTF-8): ```bash iconv -f gbk -t utf8 mydb_gbk.sql > mydb_utf8.sql ``` ### 关键注意事项: 1. **字符集一致性** 导出字符集需与数据库实际编码一致,可通过以下命令查看数据库编码: ```sql SHOW VARIABLES LIKE 'character_set_database'; ``` 2. **避免乱码** 若导出文件出现乱码,检查: - 数据库实际存储编码 - 终端环境的编码支持 - 文件编辑器的解码设置 3. **导入时匹配编码** 导入数据时需声明相同字符集: ```bash mysql -u root -p --default-character-set=utf8mb4 mydb < mydb_utf8.sql ``` ### 完整操作示例 ```bash # 查看数据库编码(确认源字符集) mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_database';" # 以 utf8mb4 导出 mysqldump -u root -p --default-character-set=utf8mb4 mydb > mydb_backup.sql # 验证文件编码 file -i mydb_backup.sql # 应显示 charset=utf-8 ``` > **说明**:`mysqldump` 的 `--default-character-set` 参数确保 SQL 文件中的 `SET NAMES` 语句和实际数据转义均使用指定编码,这是最可靠的编码控制方式[^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风智语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值