全部博文(151)
2011年(151)
分类: LINUX
2011-05-10 01:25:43
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。
基本语法:
Shell> mysqldump [OPTIONS] database [tables] >
data_backup.sql (不指定数据库名表示全部备份)
例如:
mysqldump -uroot -p --default-character-set=cp932 --opt --extended-insert=false
--hex-blob -R -x mysql > E:\mysql.sql
主要参数:
--compatible=name
它告诉
mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options
等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。
--complete-insert,-c
导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到
max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。
--extended-insert = true|false -e
默认情况下,mysqldump
开启
--complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。
使用包括几个VALUES列表的多行INSERT语法。这样使转储文件更小,重载文件时可以加速插入。
--fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--行-terminated-by=...
--default-character-set=charset
指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。如果没有指定,mysqldump使用utf8
--disable-keys
告诉
mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000
ALTER TABLE table DISABLE KEYS */; 和 /*!40000
ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。
--hex-blob
使用十六进制符号转储二进制字符串列(例如,'abc' 变为0x616263)。影响到的列有BINARY、VARBINARY、BLOB。。如果有二进制数据就必须使用本选项。
--lock-all-tables,-x
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭
--single-transaction 和 --lock-tables 选项。
--lock-tables -l
它和
--lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。
--flush-logs,-F
开始转储前刷新MySQL服务器日志文件。该选项要求RELOAD权限。请注意如果结合--all--database(或-A)选项使用该选项,根据每个转储的数据库刷新日志。例外情况是当使用--lock-all-tables或--master-data的时候:在这种情况下,日志只刷新一次,在所有 表被锁定后刷新。如果你想要同时转储和刷新日志,应使用--flush-logs连同--lock-all-tables或--master-data。
--no-create-info,-t
只导出数据,而不添加 CREATE TABLE 语句。
--no-data,-d
不导出任何数据,只导出数据库表结构。
--no-create-db,-n
该选项禁用CREATE
DATABASE /*!32312 IF NOT EXISTS*/ db_name语句,如果给出---database或--all--database选项,则包含到输出中。
--opt
这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking
--create-option --disable-keys --extended-insert --lock-tables --quick
--set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用
--skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
---database,-B
转储几个数据库。通常情况,mysqldump将命令行中的第1个名字参量看作数据库名,后面的名看作表名。使用该选项,它将所有名字参量看作数据库名。
--delete-master-logs
在主复制服务器上,完成转储操作后删除二进制日志。该选项自动启用--master-data。
--force,-f 在表转储过程中,即使出现SQL错误也继续。
--quick,-q
该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--routines,-R
导出存储过程以及自定义函数。使用---routines产生的输出包含CREATE PROCEDURE和CREATE FUNCTION语句以重新创建子程序。但是,这些语句不包括属性,例如子程序定义者或创建和修改时间戳。这说明当重载子程序时,对它们进行创建时定义者应设置为重载用户,时间戳等于重载时间。
如果你需要创建的子程序使用原来的定义者和时间戳属性,不使用--routines。相反,使用一个具有mysql数据库相应权限的MySQL账户直接转储和重载mysql.proc表的内容。
--set-charset
将SET NAMES default_character_set加到输出中。该选项默认启用。要想禁用SET
NAMES语句,使用--skip-set-charset。
--single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。
本选项和
--lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。
要想导出大表的话,应结合使用 --quick 选项。
--triggers
同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。
--where='where-condition', -w 'where-condition'
只转储给定的WHERE条件选择的记录。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来。
"--where=user='jimf'"
"-wuserid>1"
"-wuserid<1"
--xml,-X
将转储输出写成XML。
--var_name=value选项设置下面的变量:
· max_allowed_packet
客户端/服务器之间通信的缓存区的最大大小。最大为1GB。
· net_buffer_length
客户端/服务器之间通信的缓存区的初始大小。当创建多行插入语句时(如同使用选项--extended-insert或--opt),mysqldump创建长度达net_buffer_length的行。如果增加该变量,还应确保在MySQL服务器中的net_buffer_length变量至少这么大。
--master-data[=value]
该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,并且必须启用二进制日志。如果该选项值等于1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。如果选项值等于2,CHANGE MASTER语句被写成SQL注释。如果value被省略,这是默认动作。
--master-data选项启用--lock-all-tables,除非还指定--single-transaction(在这种情况下,只在刚开始转储时短时间获得全局读锁定。又见--single-transaction。在任何一种情况下,日志相关动作发生在转储时。该选项自动关闭--lock-tables
如果运行mysqldump没有--quick或--opt选项,mysqldump在转储结果前将整个结果集装入内存。如果转储大数据库可能会出现问题。该选项默认启用,但可以用--skip-opt禁用。
mysqldump最常用于备份一个整个的数据库:
shell> mysqldump --opt db_name > backup-file.sql
你可以这样将转储文件读回到服务器:
shell> mysql db_name < backup-file.sql
或者为:
shell> mysql -e "source /path-to--backup/backup-file.sql" db_name
mysqldump也可用于从一个MySQL服务器向另一个服务器复制数据时装载数据库:
shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name
可以用一个命令转储几个数据库:
shell> mysqldump ---database db_name1 [db_name2 ...] > my_databases.sql
如果你想要转储所有数据库,使用--all--database选项:
shell> mysqldump --all-databases > all_databases.sql
如果表保存在InnoDB存储引擎中,mysqldump提供了一种联机备份的途径(参见下面的命令)。该备份只需要在开始转储时对所有表进行全局读锁定(使用FLUSH TABLES WITH READ LOCK)。获得锁定后,读取二进制日志的相应内容并将锁释放。因此如果并且只有当发出FLUSH...时正执行一个长的更新语句,MySQL服务器才停止直到长语句结束,然后转储则释放锁。因此如果MySQL服务器只接收到短("短执行时间")的更新语句,即使有大量的语句,也不会注意到锁期间。
shell> mysqldump --all-databases --single-transaction > all_databases.sql
对于点对点恢复(也称为“前滚”,当你需要恢复旧的备份并重放该备份以后的更改时),循环二进制日志(参见5.11.3节,“二进制日志”)或至少知道转储对应的二进制日志内容很有用:
shell> mysqldump --all-databases --master-data=2 > all_databases.sql
或
shell> mysqldump --all-databases --flush-logs --master-data=2 > all_databases.sql
如果表保存在InnoDB存储引擎中,同时使用--master-data和--single-transaction提供了一个很方便的方式来进行适合点对点恢复的联机备份。
1.导出结构不导出数据
shell>mysqldump -B xscj --dump-date -uroot -p --add-drop-database --opt --no-data >/databak/xscj.sql
2.导出数据不导出结构
shell> mysqldump -B xscj --dump-date -t -uroot -p >/databak/xscj-noinfo.sql
3.导出数据和结构
shell> mysqldump -B xscj --dump-date --add-drop-database --opt -uroot -p >/databak/xscj-all.sql
4.导出特定表的结构(不带数据)
shell>mysqldump -B xscj --table xs --no-data -uroot -p >/databak/xs-nodata.sql
另:mysqldump 还可以将数据和表结构分别备份
shell> mysqldump -S /usr/local/mysql01/tmp/mysql01.socket -uroot -p --tab=/dbackup/ xscj
mysqldump将把XSCJ数据库下的所有表及其表数据分开备份到/dbackup目录中,如下:
用此方法备份数据库mysqldump必须在服务器上执行
此时还原数据结构的时候可以使用
shell>mysql -uroot -p xscj < /dbackup/kc.sql ,还原kc表结构
shell>mysql -uroot -p xscj < /dbackup/xs.sql,还原xs表结构
shell>mysql -uroot -p xscj < /dbackup/xs_kc.sql,还原xs_kc表结构
这些表还是空的,如何恢复数据呢?用 mysqlimport 导入数据
shell>mysqlimport -uroot -p --lock-tables --low-priority --replace --local xscj /dbackup/kx.txt
用mysqlimport导入数据的时候注意选项参数
-i, --ignore If duplicate unique key was found, keep old row
-r, --replace If duplicate unique key was found, replace old row.
练习:
1.将整个数据库备份成all.sql文件
#/usr/local/mysql/bin/mysqldump -uroot --default-character-set=cp932 --opt
--extended-insert=false --hex-blob -x --all-databases > all.sql
2.将整个数据库的表结构备份成table.sql,不要数据和trigger
#/usr/local/mysql/bin/mysqldump -uroot --default-character-set=cp932 --opt --extended-insert=false
--hex-blob -x --all-database --no-data --skip-triggers database > table.sql
3.将所有数据备份成data.sql,注意不要表结构和trigger
#/usr/local/mysql/bin/mysqldump -uroot --default-character-set=cp932 --opt
--extended-insert=false --hex-blob -x --all-database --no-create-info
--skip-triggers database > data.sql
4.只将trigger备份成trigger.sql,数据和表结构都不要。
#/usr/local/mysql/bin/mysqldump -uroot --default-character-set=cp932 --opt
--extended-insert=false --hex-blob -x triggers >trigger.sql
---------
1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
例:mysqldump
-u wcnc -p smgp_apps_wcnc > wcnc.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
例:mysqldump
-u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.导出一个数据库结构
mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc > wcnc_db.sql
说明:-d
没有数据
--add-drop-table 在每个create语句之前增加一个drop
table
##############
#### 恢 复 ####
#############
使用mysqldump导出的文件恢复数据库
用
mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。
1)直接用
mysql 客户端
shell> mysql 库名 < 文件名
例如:
#/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
2)用
source 语句
其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:
# source /tmp/db_name.sql; (这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户有权限读取的文件)
mysqlhotcopy:数据库备份程序
mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供。它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库目录所在的机器上。mysqlhotcopy只用于备份MyISAM。它运行在Unix和NetWare中。
shell> mysqlhotcopy db_name [/path/to/new_directory]
shell> mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
备份给定数据库中的匹配正则表达式的表:
shell> mysqlhotcopy db_name./regex/
加上发音符(‘~’)前缀,表名的正则表达式可以被否定:
shell> mysqlhotcopy db_name./~regex/
--flushlog
所有表锁定后刷新日志。
--keepold
完成后不删除以前(重新命名的)的目标。
-- method=command
复制方法(cp或scp)
--noindices
备份中不包括全部索引文件。这样使备份更小、更快。可以在以后用myisamchk -rq重新构建索引。
--allowold
如果目标存在不放弃(加上一个_old后缀重新命名它)。
--checkpoint=db_name.tbl_name
在指定的db_name.tbl_name插入检查点条目。
标准语法:
mysqlhotcopy -u root -p password01 -S /usr/local/mysql/tmp/mysql.socket xscj /dbackup
mysqlshow客户可用来很快地查找存在哪些数据库,数据库中的表,表中的列或索引。
mysqlshow -uroot -p -S /usr/local/mysql/tmp/mysql.socket xscj kc
myisamlog:显示MyISAM日志文件内容
stat /tmp/test.sql | grep Change ,可以查看sql 备份的时间错
mysql 二进制日志还原
mysqlbinlog -d xscj --start-datetime='2011-02-06 3:01:17' --stop-datetime='2011-02-06 3:03:49' /usr/local/mysql/binlog/mysql-bin.000042 | mysql -uroot -S /usr/local/mysql/tmp/mysql.socket -p