6 MYSQL备份与恢复
mysqlhotcopy
其命令格式如下:
shell> mysqlhotcopy db_name /path/to/some/dir
只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。
mysqldump
mysqldump提供在线逻辑备份,我们在备份的时候使用single-transaction参数的话,MYSQL为我们提供一致性地读,并且保证mysqldump所看见的数据不会更改。(其它客户端对InnoDB表进行的更改不会被mysqldump进程看见)该参数自动关闭--lock-tables。如果我们还有其它类型的表,我们必须假定在备份过程中它们不会更改。例如,对于mysql数据库中的MyISAM表,我们必须假定在备份过程中没有对MySQL账户进行管理更改。mysqldump命令产生的.sql文件包含一系列SQL INSERT语句,可以用来重载转储的表。
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p mytest >mytest.sql Enter password: ******
生成的mytest.sql文件的示例内容如下:
-- MySQL dump 10.10 -- -- Host: localhost Database: mytest -- ------------------------------------------------------ -- Server version 5.0.27-community-nt /**//*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /**//*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /**//*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /**//*!40101 SET NAMES utf8 */; /**//*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /**//*!40103 SET TIME_ZONE='+00:00' */; /**//*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /**//*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /**//*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /**//*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `aaa` -- DROP TABLE IF EXISTS `aaa`; CREATE TABLE `aaa` ( `id` decimal(18,2) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Dumping data for table `aaa` -- LOCK TABLES `aaa` WRITE; /**//*!40000 ALTER TABLE `aaa` DISABLE KEYS */; INSERT INTO `aaa` VALUES ('3000.00'); /**//*!40000 ALTER TABLE `aaa` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `customer` -- DROP TABLE IF EXISTS `customer`; CREATE TABLE `customer` ( `A` int(11) default NULL, `B` char(20) default NULL, KEY `A` (`A`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; …… LOCK TABLES `test_isam` WRITE; /**//*!40000 ALTER TABLE `test_isam` DISABLE KEYS */; INSERT INTO `test_isam` VALUES (999013,'test'),(999014,'test'),(999015,'test'),(999016,'test'),(999017,'test'),(999018,'test'),(999019,'test'),(999020,'test') ,(999265,'test'),(999266,'test') ……
mysqldump增量备份
要想进行增量备份,我们需要保存增量更改。应使用--log-bin选项启动MySQL服务器,以便更新数据时将这些更改保存到文件中。该选项启用二进制日志,因此服务器写将每个更新数据的SQL语句写入MySQL二进制日志。
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.0\my.ini" --log-bin 070609 17:58:42 [Warning] Changed limits: max_open_files: 2048 max_connections: 800 table_cache: 619
我们可以在basedir找到以下MySQL二进制日志文件:
mochasof-8ed6b1-bin.000001 mochasof-8ed6b1-bin.000002 mochasof-8ed6b1-bin.000003
每次重启,MySQL服务器用序列中的下一个编号创建一个新的二进制日志文件。当服务器运行时,我们还可以通过执行FLUSH LOGS语句或mysqladmin flush-logs命令,告诉服务器关闭当前的二进制日志文件并创建一个新文件。
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqladmin -uroot -p flush-logs Enter password: ******
该命令类似于ORACLE的alter system switch logfile命令(日志切换)。mysqldump也有一个选项来清空日志。数据目录中的.index文件包含该目录下所有MySQL二进制日志的清单。该文件用于复制。
恢复时MySQL二进制日志很重要,因为它们是增量备份。如果进行完全备份时确保清空了日志,则后面创建的二进制日志文件包含了备份后的所有数据更改。让我们稍稍修改前面的mysqldump命令,让它在完全备份时能够清空 MySQL二进制日志,以便转储文件包含包含新的当前的二进制日志,我们在basedir下看到MYSQL产生的最新的日志文件mochasof-8ed6b1-bin.000004:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases> backup_all.sql Enter password: ******
Backup.sql文件包含下列行:
-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mochasof-8ed6b1-bin.000004', MASTER_LOG_POS=98; -- -- Current Database: `mysql` -- CREATE DATABASE /**//*!32312 IF NOT EXISTS*/ `mysql` /**//*!40100 DEFAULT CHARACTER SET latin1 */; USE `mysql`;
--master-data参数:
这个参数把二进制日志的位置和文件名写入备份文件中,如果该值等于1,在备份文件中将会打印一个CHANGE MASTER命令;如果该值等于2,在备份文件中将会给出一个包括CHANGE MASTER的注释,这个操作将会打开--lock-all-tables选项开关,除非和我们前边提到过的--single-transaction参数选项一起结合使用,这时--single-transaction优先级高于master-data,在备份期间人户引起日志改变的操作都自动将--lock-tables关闭。以下是从MYSQL的help中获得的信息。
--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.
因为mysqldump命令可以执行完全备份,这些行表示两件事情:
A、backup.sql文件包含所有写入mochasof-8ed6b1-bin.000004二进制日志文
件或最新的文件之前的更改。
B、备份后所记录的所有数据更改不出现在backup.sql中,但出现在mochasof-8ed6b1-bin.000004二进制日志文件或最新的文件中。
接下来我们可以清空日志开始新的二进制日志文件来创建增量备份。例如,执行mysqladmin flush-logs命令创建mochasof-8ed6b1-bin.000005。完全备份之后所有更改为文件mochasof-8ed6b1-bin.000004。该增量备份很重要,因此最好将它复制到安全的地方。(例如,备份到磁带或DVD上,或复制到另一台机器上)。以后我们执行另一个mysqladmin flush-logs命令创建mochasof-8ed6b1-bin.000006,mochasof-8ed6b1-bin.000005也应复制到某个安全的地方。
MySQL二进制日志占据硬盘空间。要想释放空间,应随时清空。操作方法是删掉不再使用的二进制日志,例如进行完全备份时:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --delete-master-logs mytest > mytest_new.sql
Enter password: ******
注释:如果你的服务器为复制主服务器,用mysqldump --delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进制日志的内容。
PURGE MASTER LOGS语句的描述中解释了为什么在删掉MySQL二进制日志之前应进行确认。