快捷搜索:

MySQL的备份守则和方法

在数据库表损掉或毁坏的环境下,备份你的数据库是很紧张的。假如发生系统崩溃,你肯定想能够将你的表尽可能损掉起码的数据规复到崩溃发生时的状态。无意偶尔,恰是MySQL治理员造成破坏。治理员已经知道表已破坏,用诸如vi或Emacs等编辑器试图直接编辑它们,这对表绝对不是件好事!备份数据库两个主要措施是用mysqldump法度榜样或直接拷贝数据库文件(如用cp、cpio或tar等)。 每种措施都有其优毛病: mysqldump与MySQL办事器协同操作。直接拷贝措施在办事器外部进行,并且你必须采取步伐包管没有客户正在改动你将拷贝的表。假如你想用文件系统备份来备份数据库,也会发生同样的问题:假如数据库表在文件系统备份历程中被改动,进入备份的表文件主语不同等的状态,而对今后的规复表将掉去意义。文件系统备份与直接拷贝文件的差别是对后者你完全节制了备份历程,这样你能采取步伐确保办事器让表不受滋扰。mysqldump比直接拷贝要慢些。 mysqldump天生能够移植到其它机械的文本文件,以致那些有不合硬件布局的机械上。直接拷贝文件不能移植到其它机械上,除非你正在拷贝的表应用MyISAM存储款式。ISAM表只能在相似的硬件布局的机械上拷贝。在MySQL 3.23中引入的MyISAM表存储款式办理了该问题,由于该款式是机械 无关的,以是直接拷贝文件可以移植到具有不合硬件布局的机械上。只要满意两个前提:另一台机械必须也运行MySQL 3.23或今后版本,而且文件必须以MyISAM款式表示,而不是ISAM款式。

不管你应用哪种备份措施,假如你必要规复数据库,有几个原则应该遵守,以确保最好的结果:

按期实施备份,建立一个计划并严格遵守

让办事器履行更新日志。当你在崩溃后必要规复数据时,更新日志将赞助你。在你用备份文件规复数据到备份时的状态后,你可以经由过程运行更新日志中的查询再次运用备份后面的改动,这将数据库中的表规复到崩溃发生时的状态。 以文件系统备份的术语讲,数据库备份文件代表完全倾倒(full dump),而更新日志代表渐进倾倒(incremental dump)。

应用一种统一的和易理解的备份文件命名机制

象backup1、buckup2等不是分外故意义。当实施你的规复时,你将挥霍光阴找出文件里是什么器械。你可能发觉用数据库名和日期构成备份文件名会很有用。例如:

%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

%mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02

你可能想在天生备份后压缩它们。备份一样平常都很大年夜!你也必要让你的备份文件有过时候日以避免它们填满你的磁盘,就象你让你的日志文件过时那样。用文件系统备份备份你的备份文件。假如赶上了一个彻底崩溃,不仅清除了你的数据目录,也清除了包孕你的数据库备份的磁盘驱动器,你将真正赶上了麻烦。也要备份你的更新日志。将你的备份文件放在不合于用于你的数据库的文件系统上。这将低落因为天生备份而填满包孕数据目录的文件系统的可能性。

用于创建备份的技巧同样对拷贝数据库到另一台机械有用。最常见解,一个数据库被转移到了运行在另一台主机上的办事器,然则你也可以将数据转移到同一台主机上的另一个办事器。

1.应用mysqldump备份和拷贝数据库

当你应用mysqldumo法度榜样孕育发生数据库备份文件时,缺省地,文件内容包孕创建正在倾倒的表的CREATE语句和包孕表中行数据的INSERT语句。换句话说,mysqldump孕育发生的输出可在今后用作mysql的输入来重修数据库。 你可以将全部数据库倾倒进一个零丁的文本文件中,如下:

%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02

输出文件的开首看起来象这样:

# MySQL Dump 6.0#

# Host: localhost Database: samp_db

#---------------------------------------

# Server version 3.23.2-alpha-log

## Table structure for table 'absence'#

CREATE TABLE absence( student_id int(10)

unsigned DEFAULT '0' NOT NULL, date date DEFAULT '0000-00-00' NOT NULL, PRIMARY KEY (student_id,date));

## Dumping data for table 'absence'#

INSERT INTO absence VALUES (3,'1999-09-03');

INSERT INTO absence VALUES (5,'1999-09-03');

INSERT INTO absence VALUES (10,'1999-09-08');

......

--flush-logs 和 --lock-tables 组合将对你的数据库反省点有赞助。

--lock-tables 锁定你正在倾倒的所有表

而 --flush-logs 关闭并从新打开更新日志文件,新的更新日志将只包括从备份点起的改动数据库的查询。这将设置你的更新日志反省点位备份光阴。(然而假如你有必要履行个更新的客户,锁定所有表对备份时代的客户造访不是件好事。)假如你应用 --flush-logs 设置反省点到备份时,有可能最好是倾倒全部数据库。假如你倾倒零丁的文件,较难将更新日志反省点与备份文件同步。在规复时代,你平日按数据库为根基提取更新日志内容,对单个表没有提取更新的选择,以是你必须自己提取它们。缺省地,mysqldump 在写入前将一个表的全部内容读进内存。这平日确凿不需要,并且实际上假如你有一个大年夜表,险些是掉败的。你可用 --quick 选项奉告 mysqldump 只要它检索出一行就写出每一行。为了进一步优化倾倒历程,应用 --opt而不是 --quick。--opt 选项打开其它选项,加速数据的倾倒和把它们读回。用 --opt 实施备份可能是最常用的措施,由于备份速率上的上风。然而,要警告你,--opt 选项确凿有价值,--opt 优化的是你的备份历程,不是其他客户对数据库的造访。--opt 选项经由过程一次锁定所有表阻拦任何人更新你正在倾倒的任何表。你可在一样平常数据库造访上很轻易看到其效果。当你的数据库一样平常异常频繁地应用,只是一天一次地调节备份。一个具有 --opt 的相反效果的选项是--dedayed。该选项使得 mysqldump 写出 INSERT DELAYED 语句而不是 INSERT 语句。假如你将数据文件装入另一个数据库并且你想是这个操作对可能呈现在该数据库中的查询的影响最小,--delayed 对此很有赞助。 --compress 选项在你拷贝数据库到另一台机械上时很有赞助,由于它削减收集传输字节的数量。下面有一个例子,留意到--compress 对与远端主机上的办事器通信的法度榜样才给出,而不是对与本地主机连接的法度榜样:

4.用备份规复数据

数据库毁坏的发生有很多缘故原由,程度也不合。假如你行运,你可能仅毁坏一两个表(如掉落电),假如你不利,你可能必须调换全部数据目录(如磁盘毁坏)。在某些环境下也必要规复,比如用户差错地删除了数据库或表。不管这些不利事故的缘故原由,你将必要实施某种规复。假如表毁坏但没损掉,考试测验用 myisamchk 或 isamchk 修复它们,假如这样的毁坏可有修复法度榜样修复,你可能根本不必要应用备份文件。关于表修复的历程,见《数据库掩护与修复》。规复历程涉及两种信息源:你的备份文件和个更新日志。备份文件将表规复到实施备份时的状态,然而一样平常表在备份与发生问题之间的光阴内已经被改动,更新日志包孕了用于进行这些改动的查询。你可以应用日志文件作为mysql的输入来重复查询。这已恰是为什么要启用更新日志的缘故原由。规复历程视你必须规复的信息若干而不合。实际上,规复全部数据库比单个表跟轻易,由于对付

数据库运用更新日志比单个表轻易。

4.1 规复全部数据库

首先,假如你想规复的数据库是包孕授权表的 mysql 数据库,你必要用 --skip-grant-table 选项运行办事器。否则,它会诉苦不能找到授权表。在你已经规复表后,履行 mysqladmin flush-privileges 奉告办事器装载授权标并应用它们。将数据库目录内容拷贝到其它某个地方,假如你在今后必要它们。用最新的备份文件重装数据库。假如你用 mysqldump 孕育发生的文件,将它作为 mysql 的输入。假如你用直接从数据库拷贝来的文件,将它们直接拷回数据库目录,然而,此时你必要在拷贝文件之前关闭数据库,然后重启它。应用更新日志重复做备份今后的改动数据库表的查询。对付任何可适用的更新日志,将它们作为 mysql 的输入。指定 --one-database 选项使得 mysql 只履行你有兴趣规复的数据库的查询。假如你知道你必要运用所有更新日志文件,你可以在包孕日志的目录下应用这条敕令:

% ls -t -r -1 update.[0-9]* │ xargs cat │ mysql --one-database db_name

ls敕令天生更新日志文件的一个单列列表,根据办事器孕育发生它们的序次排序(主见:假如你改动任何一个文件,你将改变排次序序,这导致更新日志一差错的序次被运用。)很可能你会是运用某几个更新日志。例如,自从你备份以来孕育发生的更新日志被命名为 update.392、update.393 等等,你可以这样从新运行:

%mysql --one-database db_name

假如你正在实施规复且应用更新日志规复因为一个差错建议的 DROP DATABASE、DROP TABLE 或 DELETE 语句造成损掉的信息,在运用更新日志之前,要包管从此中删除这些语句。

4.2 规复单个表

规复单个表较为繁杂。假如你用一个由 mysqldump 天生的备份文件,并且它不包孕你感兴趣的表的数据,你必要从相关行中提取它们并将它们用作 mysql 的输入。这是轻易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉 mysql_find_rows 实用法度榜样对此很有赞助,它从更新日志中提取多行查询。另一个可能性是应用另一台办事器规复全部数据库,然后拷贝你想要的表文件到原数据库中。这可能真的很轻易!当你将文件拷回数据库目录时,要确保原数据库的办事器关闭。

您可能还会对下面的文章感兴趣: