对数据库来讲,最重要也最容易被忽视的就是备份。因为不可预测性,偶然的事件可能会致使很是惨重的损失。正则表达式
数据越是重要,数据的变化越频繁,备份愈加须要常常进行。sql
备份周期根据不一样业务的须要能够调整,可是不能忽视备份。shell
备份时最好也备份my.cnf或my.ini,这样能够保存你之前的配置参数。数据库
由于MySQL表保存为文件方式,很容易备份。要想保持备份的一致性,对相关表执行LOCK TABLES操做,而后对表执行FLUSH TABLES。缓存
你只须要读锁定;这样当你复制数据库目录中的文件时,容许其它客户继续查询表。须要FLUSH TABLES语句来确保开始备份前将全部激活的索引页写入硬盘。安全
标准流程:锁表-》刷新表到磁盘-》拷贝文件-》解锁。服务器
若是你想要进行SQL级别的表备份,你可使用SELECT INTO ...OUTFILE或BACKUP TABLE。对于SELECT INTO ...OUTFILE, 输出的文件不能先存在。oracle
对于BACKUP TABLE也如此,由于覆盖完整的文件会有安全风险。负载均衡
这两种备份方法,若是输出文件有重名的话,最好把重名文件移除。
BACKUP TABLE备份时注意输出目录的权限,改方法只是备份MYD和frm文件,不备份索引。
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/
mysqlhotcopy支持下面的选项:
· ---help,-?
显示帮助消息并退出。
· --allowold
若是目标存在不放弃(加上一个_old后缀从新命名它)。
· --checkpoint=db_name.tbl_name
在指定的db_name.tbl_name插入检查点条目。
· ---debug
启用调试输出。
· --dryrun,-n
报告动做而不执行它们。
· --flushlog
全部表锁定后刷新日志。
· --keepold
完成后不删除之前(从新命名的)的目标。
· -- method=command
复制方法(cp或scp)。
· --noindices
备份中不包括所有索引文件。这样使备份更小、更快。能够在之后用myisamchk -rq从新构建索引。
· --password=password,-p password
当链接服务器时使用的密码。请注意该选项的密码值是不可选的,不象其它MySQL程序。
· --port=port_num,-P port_num
当链接本地服务器时使用的TCP/IP端口号。
· --quiet,-q
除了出现错误时保持沉默。
· --regexp=expr
复制全部数据库名匹配给出的正则表达式的数据库。
· --socket=path,-S path
用于链接的Unix套接字文件。
· --suffix=str
所复制的数据库名的后缀。
· --tmpdir=path
临时目录(代替/tmp)。
· --user=user_name,-u user_name
当链接服务器时使用的MySQL用户名。
mysqlhotcopy从选项文件读取[client]和[mysqlhotcopy]选项组。
由于mysqlhotcopy通常是用来作彻底备份,因此推荐使用—flushlog选项来产生增量更新日志。
能够备份表结构和数据,能够同时支持MyISAM和InnoDB引擎数据库。
mysqldump能够备份单个表、单个库或全部库。
Mysqldump 还能够只导出表结构。
mysqldump是逻辑备份,输出的是sql语句文件,还能够输出其余数据库兼容的格式。
有3种方式来调用mysqldump:
shell> mysqldump [options] db_name [tables]
shell> mysqldump [options] ---database DB1 [DB2 DB3...]
shell> mysqldump [options] --all--database
若是没有指定任何表或使用了---database或--all--database选项,则转储整个数据库。
要想得到你的版本的mysqldump支持的选项,执行mysqldump ---help。
若是运行mysqldump没有--quick或--opt选项,mysqldump在转储结果前将整个结果集装入内存。若是转储大数据库可能会出现问题。该选项默认启用,但能够用--skip-opt禁用。
mysqldump支持下面的选项:
· ---help,-?
显示帮助消息并退出。
· --add-drop--database
在每一个CREATE DATABASE语句前添加DROP DATABASE语句。
· --add-drop-tables
在每一个CREATE TABLE语句前添加DROP TABLE语句。
· --add-locking
用LOCK TABLES和UNLOCK TABLES语句引用每一个表转储。重载转储文件时插入得更快。
· --all--database,-A
转储全部数据库中的全部表。与使用---database选项相同,在命令行中命名全部数据库。
· --allow-keywords
容许建立关键字列名。应在每一个列名前面加上表名前缀。
· ---comments[={0|1}]
若是设置为 0,禁止转储文件中的其它信息,例如程序版本、服务器版本和主机。--skip—comments与---comments=0的结果相同。 默认值为1,即包括额外信息。
· --compact
产生少许输出。该选项禁用注释并启用--skip-add-drop-tables、--no-set-names、--skip-disable-keys和--skip-add-locking选项。
· --compatible=name
产生与其它数据库系统或旧的MySQL服务器更兼容的输出。值能够为ansi、mysql32三、mysql40、postgresql、oracle、mssql、db二、maxdb、no_key_options、no_tables_options或者no_field_options。要使用几个值,用逗号将它们隔开。这些值与设置服务器SQL模式的相应选项有相同的含义。
该选项不能保证同其它服务器之间的兼容性。它只启用那些目前可以使转储输出更兼容的SQL模式值。例如,--compatible=oracle 不映射Oracle类型或使用Oracle注释语法的数据类型。
· --complete-insert,-c
使用包括列名的完整的INSERT语句。
· --compress,-C
压缩在客户端和服务器之间发送的全部信息(若是两者均支持压缩)。
· --create-option
在CREATE TABLE语句中包括全部MySQL表选项。
· ---database,-B
转储几个数据库。一般状况,mysqldump将命令行中的第1个名字参量看做数据库名,后面的名看做表名。使用该选项,它将全部名字参量看做数据库名。CREATE DATABASE IF NOT EXISTS db_name和USE db_name语句包含在每一个新数据库前的输出中。
· ---debug[=debug_options],-# [debug_options]
写调试日志。debug_options字符串一般为'd:t:o,file_name'。
· --default-character-set=charset
使用charsetas默认字符集。若是没有指定,mysqldump使用utf8。
· --delayed-insert
使用INSERT DELAYED语句插入行。
· --delete-master-logs
在主复制服务器上,完成转储操做后删除二进制日志。该选项自动启用--master-data。
· --disable-keys,-K
对于每一个表,用;和;语句引用INSERT语句。这样能够更快地装载转储文件,由于在插入全部行后建立索引。该选项只适合MyISAM表。
· --extended-insert,-e
使用包括几个VALUES列表的多行INSERT语法。这样使转储文件更小,重载文件时能够加速插入。
· --fields-terminated-by=...,--fields-enclosed-by=...,--fields-optionally-enclosed-by=...,--fields-escaped-by=...,--行-terminated-by=...
这些选项结合-T选项使用,与LOAD DATA INFILE的相应子句有相同的含义。
· --first-slave,-x
不同意使用,如今从新命名为--lock-all-tables。
· --flush-logs,-F
开始转储前刷新MySQL服务器日志文件。该选项要求RELOAD权限。请注意若是结合--all--database(或-A)选项使用该选项,根据每一个转储的数据库刷新日志。例外状况是当使用--lock-all-tables或--master-data的时候:在这种状况下,日志只刷新一次,在全部 表被锁定后刷新。若是你想要同时转储和刷新日志,应使用--flush-logs连同--lock-all-tables或--master-data。
· --force,-f
在表转储过程当中,即便出现SQL错误也继续。
· --host=host_name,-h host_name
从给定主机的MySQL服务器转储数据。默认主机是localhost。
· --hex-blob
使用十六进制符号转储二进制字符串列(例如,'abc' 变为0x616263)。影响到的列有BINARY、VARBINARY、BLOB。
· --lock-all-tables,-x
全部数据库中的全部表加锁。在总体转储过程当中经过全局读锁定来实现。该选项自动关闭--single-transaction和--lock-tables。
· --lock-tables,-l
开始转储前锁定全部表。用READ LOCAL锁定表以容许并行插入MyISAM表。对于事务表例如InnoDB和BDB,--single-transaction是一个更好的选项,由于它不根本须要锁定表。
请注意当转储多个数据库时,--lock-tables分别为每一个数据库锁定表。所以,该选项不能保证转储文件中的表在数据库之间的逻辑一致性。不一样数据库表的转储状态能够彻底不一样。
· --master-data[=value]
该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,而且必须启用二进制日志。若是该选项值等于1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,若是你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。若是选项值等于2,CHANGE MASTER语句被写成SQL注释。若是value被省略,这是默认动做。
--master-data选项启用--lock-all-tables,除非还指定--single-transaction(在这种状况下,只在刚开始转储时短期得到全局读锁定。又见--single-transaction。在任何一种状况下,日志相关动做发生在转储时。该选项自动关闭--lock-tables。
· --no-create-db,-n
该选项禁用CREATE DATABASE db_name语句,若是给出---database或--all--database选项,则包含到输出中。
· --no-create-info,-t
不写从新建立每一个转储表的CREATE TABLE语句。
· --no-data,-d
不写表的任何行信息。若是你只想转储表的结构这颇有用。
· --opt
该选项是速记;等同于指定 --add-drop-tables--add-locking --create-option --disable-keys--extended-insert --lock-tables --quick --set-charset。它能够给出很快的转储操做并产生一个能够很快装入MySQL服务器的转储文件。该选项默认开启,但能够用--skip-opt禁用。要想只禁用确信用-opt启用的选项,使用--skip形式;例如,--skip-add-drop-tables或--skip-quick。
· --password[=password],-p[password]
链接服务器时使用的密码。若是你使用短选项形式(-p),不能在选项和密码之间有一个空格。若是在命令行中,忽略了--password或-p选项后面的 密码值,将提示你输入一个。
· --port=port_num,-P port_num
用于链接的TCP/IP端口号。
· --protocol={TCP | SOCKET | PIPE | MEMORY}
使用的链接协议。
· --quick,-q
该选项用于转储大的表。它强制mysqldump从服务器一次一行地检索表中的行而不是检索全部行并在输出前将它缓存到内存中。
· --quote-names,-Q
用‘`’字符引用数据库、表和列名。若是服务器SQL模式包括ANSI_QUOTES选项,用‘"’字符引用名。默认启用该选项。能够用--skip-quote-names禁用,但该选项应跟在其它选项后面,例如能够启用--quote-names的--compatible。
· --result-file=file,-r file
将输出转向给定的文件。该选项应用在Windows中,由于它禁止将新行‘/n’字符转换为‘/r/n’回车、返回/新行序列。
· --routines,-R
在转储的数据库中转储存储程序(函数和程序)。使用---routines产生的输出包含CREATE PROCEDURE和CREATE FUNCTION语句以从新建立子程序。可是,这些语句不包括属性,例如子程序定义者或建立和修改时间戳。这说明当重载子程序时,对它们进行建立时定义者应设置为重载用户,时间戳等于重载时间。
若是你须要建立的子程序使用原来的定义者和时间戳属性,不使用--routines。相反,使用一个具备mysql数据库相应权限的MySQL帐户直接转储和重载mysql.proc表的内容。
该选项在MySQL 5.1.2中添加进来。在此以前,存储程序不转储。
· --set-charset
将SET NAMES default_character_set加到输出中。该选项默认启用。要想禁用SET NAMES语句,使用--skip-set-charset。
· --single-transaction
该选项从服务器转储数据以前发出一个BEGIN SQL语句。它只适用于事务表,例如InnoDB和BDB,由于而后它将在发出BEGIN而没有阻塞任何应用程序时转储一致的数据库状态。
当使用该选项时,应记住只有InnoDB表能以一致的状态被转储。例如,使用该选项时任何转储的MyISAM或HEAP表仍然能够更改状态。
--single-transaction选项和--lock-tables选项是互斥的,由于LOCK TABLES会使任何挂起的事务隐含提交。
要想转储大的表,应结合--quick使用该选项。
· --socket=path,-S path
当链接localhost(为默认主机)时使用的套接字文件。
· --skip--comments
参见---comments选项的描述。
· --tab=path,-T path
产生tab分割的数据文件。对于每一个转储的表,mysqldump建立一个包含建立表的CREATE TABLE语句的tbl_name.sql文件,和一个包含其数据的tbl_name.txt文件。选项值为写入文件的目录。
默认状况,.txt数据文件的格式是在列值和每行后面的新行之间使用tab字符。可使用--fields-xxx和--行--xxx选项明显指定格式。
注释:该选项只适用于mysqldump与mysqld服务器在同一台机器上运行时。你必须具备FILE权限,而且服务器必须有在你指定的目录中有写文件的许可。
· --tables
覆盖---database或-B选项。选项后面的全部参量被看做表名。
· --triggers
为每一个转储的表转储触发器。该选项默认启用;用--skip-triggers禁用它。
· --tz-utc
在转储文件中加入SET TIME_ZONE='+00:00'以便TIMESTAMP列能够在具备不一样时区的服务器之间转储和重载。(不使用该选项,TIMESTAMP列在具备本地时区的源服务器和目的服务器之间转储和重载)。--tz-utc也能够保护因为夏令时带来的更改。--tz-utc默认启用。要想禁用它,使用--skip-tz-utc。该选项在MySQL 5.1.2中加入。
· --user=user_name,-u user_name
链接服务器时使用的MySQL用户名。
· --verbose,-v
冗长模式。打印出程序操做的详细信息。
· --version,-V
显示版本信息并退出。
· --where='where-condition', -w 'where-condition'
只转储给定的WHERE条件选择的记录。请注意若是条件包含命令解释符专用空格或字符,必定要将条件引用起来。
当mysql服务器中止时,经过复制全部表文件(*.frm、*.MYD和*.MYI文件)来备份MyISAM数据库。
一、 若是是经过mysqldump备份的,就执行:mysql –u root < 备份文件名。
二、 若是经过mysqlhotcopy或文件冷/热拷贝来备份的,中止mysql服务,使用备份文件来覆盖现有文件。
三、 若是是采用BACKUP TABLE备份的,使用restore table来恢复。由于backup table不会备份索引文件,恢复表注意重建索引。
四、 若是是采用SELECT INTO ...OUTFILE备份的,使用load data恢复数据,也可使用mysqlimport命令来代替。
日志备份能够支持MyISAM和InnoDB,这跟有些备份工具只支持MyISAM不同。
另外,日志能够作增量备份,这是其余方法没法作到的。
启动日志备份:用--log-bin[=file_name]选项来启动mysql服务。
先执行FLUSH LOGS刷新日志,同步日志缓存到磁盘,关闭当前的日志并产生新的日志文件。
拷贝上一次完整备份或增量备份后的一个或一些日志文件到一个安全的地方。
这样就制做了一个增量备份。
日志恢复能够选择恢复某个数据库、某些操做点或时间范围,很是灵活。
经过mysqlbinlog工具能够恢复二进制日志,能够一次恢复多个日志文件,命令以下:
shell> mysqlbinlog [options] hostname-bin.[0-9]* | mysql
mysqlbinlog命令选项
· ---help,-?
显示帮助消息并退出。
· ---database=db_name,-d db_name
只列出该数据库的条目(只用本地日志)。
· --force-read,-f
使用该选项,若是mysqlbinlog读它不能识别的二进制日志事件,它会打印警告,忽略该事件并继续。没有该选项,若是mysqlbinlog读到此类事件则中止。
· --hexdump,-H
在注释中显示日志的十六进制转储。该输出能够帮助复制过程当中的调试。在MySQL 5.1.2中添加了该选项。
· --host=host_name,-h host_name
获取给定主机上的MySQL服务器的二进制日志。
· --local-load=path,-l pat
为指定目录中的LOAD DATA INFILE预处理本地临时文件。
· --offset=N,-o N
跳过前N个条目。
· --password[=password],-p[password]
当链接服务器时使用的密码。若是使用短选项形式(-p),选项和 密码之间不能有空格。若是在命令行中--password或-p选项后面没有 密码值,则提示输入一个密码。
· --port=port_num,-P port_num
用于链接远程服务器的TCP/IP端口号。
· --position=N,-j N
不同意使用,应使用--start-position。
· --protocol={TCP | SOCKET | PIPE | -position
使用的链接协议。
· --read-from-remote-server,-R
从MySQL服务器读二进制日志。若是未给出该选项,任何链接参数选项将被忽略。这些选项是--host、--password、--port、--protocol、--socket和--user。
· --result-file=name, -r name
将输出指向给定的文件。
· --short-form,-s
只显示日志中包含的语句,不显示其它信息。
· --socket=path,-S path
用于链接的套接字文件。
· --start-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件开始读取。datetime值相对于运行mysqlbinlog的机器上的本地时区。该值格式应符合DATETIME或TIMESTAMP数据类型。例如:
shell> mysqlbinlog --start-datetime="2004-12-25 11:25:56" binlog.000003
该选项能够帮助点对点恢复。
· --stop-datetime=datetime
从二进制日志中第1个日期时间等于或晚于datetime参量的事件起中止读。关于datetime值的描述参见--start-datetime选项。该选项能够帮助及时恢复。
· --start-position=N
从二进制日志中第1个位置等于N参量时的事件开始读。
· --stop-position=N
从二进制日志中第1个位置等于和大于N参量时的事件起中止读。
· --to-last-logs,-t
在MySQL服务器中请求的二进制日志的结尾处不中止,而是继续打印直到最后一个二进制日志的结尾。若是将输出发送给同一台MySQL服务器,会致使无限循环。该选项要求--read-from-remote-server。
· --disable-logs-bin,-D
禁用二进制日志。若是使用--to-last-logs选项将输出发送给同一台MySQL服务器,能够避免无限循环。该选项在崩溃恢复时也颇有用,能够避免复制已经记录的语句。注释:该选项要求有SUPER权限。
· --user=user_name,-u user_name
链接远程服务器时使用的MySQL用户名。
· --version,-V
显示版本信息并退出。
还可使用--var_name=value选项设置下面的变量:
· open_files_limit
指定要保留的打开的文件描述符的数量。
InnoDB Hotbackup 是一个在线备份工具,你能够用它来在InnoDB数据库运行之时备份你的InnoDB数据库。InnoDB 热备份工具 不要求你关闭数据库,而且它不设置任何锁定或干扰你正常的数据库处理。InnoDB 热备份工具 是非免费(商业的)附加软件,它每一年的证书费用是每台MySQL服务器运行的计算机390欧元。
具体使用方法能够参考相关文档,我也没有使用过这个工具。
Mysqldump提供对InnoDB非物理的在线逻辑热备份。
使用方法与备份MyISAM时同样。
可使用select into备份一个或多个表,用法与MyISAM表相同。
若是你能够关闭你的MySQL服务器,你能够生成一个包含InnoDB用来管理它的表的全部文件的二进制备份。使用以下步骤:
1. 关闭MySQL服务器,确信它是无错误关闭。
2. 复制你全部数据文件(ibdata文件和.ibd文件)到一个安全的地方。
3. 复制你全部ib_logfile文件到一个安全的地方。
4. 复制my.cnf配置文件或文件到一个安全的地方。
5. 为你InnoDB表复制.frm文件到一个安全的地方。
一、 先尝试使用InnoDB的日志自动恢复功能,方法是重启mysql服务。
二、 在一些状况下,明显地数据库损坏是由于操做系统损坏它本身的文件缓存,磁盘上的数据可能无缺,最好是首先重启计算机。它能够消除那些显得是数据库页损坏的错误。
若是不行,则采用下面的方法进行恢复。
三、 若是是mysqldump作的彻底备份,先恢复彻底备份,而后再恢复彻底备份后的增量日志备份。
四、 若是是采用select into备份表的话,则采用load data或mysqlimport恢复。
五、 若是是采用二进制冷备份作的彻底备份,则先中止mysql服务,覆盖备份的二进制文件,而后执行上次彻底备份后的增量日志备份。
六、 注意:InnoDB二进制文件没有MyISAM那么好,必须在相同的浮点数的cpu机器上移植。
由于在一个数据库中有可能要同时使用MyISAM和InnoDB两种引擎,所以统一考虑他们的备份/恢复策略。
一、 完整备份采用mysqldump。
二、 增量备份采用bin-log日志。
三、 单表备份采用select into。
四、
虽然MySQL提供了多种备份/恢复手段,可是按期维护表大大能够下降表毁坏的可能性,而且能够提升查询性能。
一、对于InnoDB引擎,你可使用innodb_tablespace_monitor来检查表空间文件内文件空间管理的完整性。
二、对于MyISAM引擎,能够经过sql语句或myisamchk 工具来维护表 。
在许多状况下,你会发现使用SQL语句实现MyISAM表的维护比执行myisamchk操做要容易地多:
· 要想检查或维护MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想优化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
这些语句比myisamchk有利的地方是服务器能够作任何工做。使用myisamchk,你必须确保服务器在同一时间不使用表。不然,myisamchk和服务器之间会出现不指望的相互干涉。
通常建议在中止mysql服务时执行myisamchk,若是是在线执行则最好先flush tables(把全部更新写入磁盘)。
一、必定用--log-bin或甚至--log-bin=log_name选项运行MySQL服务器,其中日志文件名位于某个安全媒介上,不一样于数据目录所在驱动器。若是你有这样的安全媒介,最好进行硬盘负载均衡(这样可以提升性能)。
二、按期进行彻底备份,使用mysqldump命令进行在线非块备份。
在负载比较低的时候进行,而且建议采用--single-transaction参数来保证事务数据的一致性,同时不影响其余用户的正常读写。
三、完整备份时采用FLUSH LOGS,便于产生增量备份日志。
四、用FLUSH LOGS或mysqladmin flush-logs 刷新日志进行按期增量备份。
五、按期维护表,这样既能够提升性能,而且能够减小数据丢失和出错的可能性。
六、关键表能够另外再作备份,根据须要。