mysql如何备份和恢复数据库

目前MySQL支持mysqldump、mysqlhotcopy等免费备份工具,也可以使用SQL语法进行备份:备份表或SELECT INTO OUTFILE,或备份二进制日志,或直接复制数据文件和相关配置文件。MyISAM表保存为文件,所以相对容易备份,上面提到的几种方法都可以。Innodb中的所有表都存储在同一个数据文件ibdata1中(可能是多个文件,也可能是独立的表空间文件),备份起来相对比较困难。免费的解决方案可以是复制数据文件,备份binlog,或者使用mysqldump。

1、mysqldump

1.1备份

Mysqldump是一种SQL级别的备份机制,将数据表转换成SQL脚本文件,相对比较适合在不同MySQL版本之间升级,也是最常用的备份方式。现在来说说mysqldump的一些主要参数:

-兼容=名称

它告诉mysqldump导出的数据将与哪个数据库或哪个旧的MySQL服务器兼容。值可以是ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等。使用多个值,并用逗号分隔。当然,并不保证完全兼容,而是尽可能兼容。

-完整-插入,-c

导出的数据采用带字段名的完全插入方式,即所有值都写在一行上。这样做可以提高插入效率,但是可能会受到max_allowed_packet参数的影响,导致插入失败。所以,你需要谨慎使用这个参数,至少我不推荐。

-default-character-set =字符集

指定导出数据时要使用的字符集。如果数据表不使用默认的latin1字符集,则导出时必须指定该选项,否则数据再次导入后会出现乱码。

-禁用键

告诉mysqldump在INSERT语句的开头和结尾加上/*!40000 ALTER TABLE表禁用键*/;和/*!40000 ALTER TABLE表启用键*/;语句,这可以大大提高插入语句的速度,因为它在插入所有数据后重建索引。此选项仅适用于MyISAM表。

- extended-insert = true|false

默认情况下,mysqldump打开-完成-插入模式,所以如果你不想使用它,只需使用这个选项并将其值设置为false。

-十六进制blob

以十六进制格式导出二进制字符串字段。如果有二进制数据,则必须使用此选项。受影响的字段类型是BINARY、VARBINARY和BLOB。

-锁定所有表,-x

在开始导出之前,提交一个请求来锁定所有数据库中的所有表,以确保数据的一致性。这是一个全局读锁,并且- single-transaction和- lock-tables选项会自动关闭。

-锁表

它类似于-lock-all-tables,但是它锁定当前导出的数据表,而不是一次锁定库下的所有表。该选项仅适用于MyISAM表,如果是Innodb表,则可以使用- single-transaction选项。

-不创建信息,-t

仅导出数据,不添加CREATE TABLE语句。

-无数据-d

不导出任何数据,仅导出数据库表格结构。

- opt

这只是一个快捷选项,相当于同时添加-添加-删除-表-添加-锁定-创建-选项-禁用-键-扩展-插入-锁定-表-快速-设置-charset选项。这个选项允许mysqldump快速导出数据,导出的数据可以快速导入回来。默认情况下,此选项是打开的,但是可以使用- skip-opt禁用它。请注意,如果您运行mysqldump时没有指定- quick或- opt选项,您会将整个结果集放入内存中。如果导出大型数据库,可能会出现问题。

-快-问

此选项在导出大型表格时很有用。它强制mysqldump直接从服务器查询中获取记录,而不是将所有记录缓存在内存中。

-例程,-R

导出存储过程和自定义函数。

-单一交易

此选项在导出数据之前提交BEGIN SQL语句。Begin不会阻塞任何应用程序,并确保导出时数据库的状态一致。它只适用于事务表,如InnoDB和BDB。该选项和-lock-tables选项是互斥的,因为锁表将使任何挂起的事务隐式提交。如果要导出一个大表,应该结合使用- quick选项。

-触发器

同时,导出触发器。默认情况下启用该选项,并使用- skip-triggers禁用它。

其他参数详情请参考手册。我通常使用以下SQL来备份MyISAM表:

/usr/local/MySQL/bin/MySQL dump-uyejr-pye Jr-default-character-set = utf8-opt-extended-insert = false \

-triggers-R-hex-blob-x db _ name & gt;数据库名称. sql

使用以下SQL来备份Innodb表:

/usr/local/MySQL/bin/MySQL dump-uyejr-pye Jr-default-character-set = utf8-opt-extended-insert = false \

- triggers -R - hex-blob -单事务数据库名称& gt数据库名称. sql

1.2缩减

mysqldump备份的文件是SQL脚本,可以直接倒进去。有两种方法可以导入数据。

直接使用mysql客户端

例如:

/usr/local/MySQL/bin/MySQL-uyejr-pye Jr db _ name & lt;数据库名称. sql

使用源语法

其实这并不是一个标准的SQL语法,而是mysql客户端提供的一个功能,比如:

SOURCE/tmp/db _ name . SQL;

这里需要指定文件的绝对路径,而且必须是mysqld运行用户(比如nobody)有权限读取的文件。

2、mysqlhotcopy

2.1备份

Mysqlhotcopy是一个PERL程序,最初由Tim Bunce编写。它使用锁表、刷新表和cp或scp来快速备份数据库。这是备份数据库或单个表的最快方法,但它只能在数据库文件(包括数据表定义文件、数据文件和索引文件)所在的计算机上运行。Mysqlhotcopy只能用于备份MyISAM,并且只能在类Unix和类NetWare系统上运行。

Mysqlhotcopy支持一次复制多个数据库,也支持正则表达式。这里有几个例子:

root #/usr/local/MySQL/bin/mysqlhotcopy-h = localhost-u = yejr-p = yejrdb_name/tmp(将数据库目录db _ name复制到/tmp)。

root #/usr/local/MySQL/bin/mysqlhotcopy-h = localhost-u = yejr-p = yejr db _ name _ 1...数据库名称n /tmp

root #/usr/local/MySQL/bin/mysqlhotcopy-h = localhost-u = yejr-p = yejr db _ name。/regex/ /tmp

更详细的用法请参考手册,或者调用以下命令查看mysqlhotcopy的帮助:

perldoc/usr/local/MySQL/bin/mysqlhotcopy

请注意,如果要使用mysqlhotcopy,您必须拥有SELECT和RELOAD权限,并且还必须拥有读取datadir/db_name目录的权限。

2.2缩减

Mysqlhotcopy备份整个数据库目录,可以直接复制到Myqld指定的datadir(此处为/usr/local/mysql/data/)目录,要注意权限的问题,如下例所示:

root # CP-RF db _ name/usr/local/MySQL/data/

root # chown-rnobody:nobody/usr/local/MySQL/data/(将db_name目录的所有者改为mysqld运行用户)。

3.SQL语法备份

3.1备份

其实BACKUP TABLE的语法类似于mysqlhotcopy的工作原理,锁定表,然后复制数据文件。可以实现在线备份,但是效果不理想,不推荐。它只复制表结构文件和数据文件,不同时复制索引文件,所以恢复比较慢。示例:

将表tbl_name返回到“/tmp/db _ name/”;

注意,要执行这个SQL,必须有文件权限,并且目录/tmp/db_name/必须是mysqld用户可写的,导出的文件不能覆盖已有的文件,以免出现安全问题。

SELECT INTO OUTFILE是将数据导出到一个普通的文本文件中,并且可以自定义字段间隔以方便对这些数据的处理。示例:

SELECT INTO OUTFILE '/tmp/db _ name/TBL _ name . txt ' FROM TBL _ name;

注意,要执行这个SQL,必须有文件权限,并且文件/tmp/db_name/tbl_name.txt必须是mysqld用户可写的,导出的文件不能覆盖已有的文件,以免出现安全问题。

3.2恢复

对于通过备份表方法备份的文件,可以运行RESTORE TABLE语句来还原数据表。示例:

从“/tmp/db_name/”中还原表;

权限要求与上面描述的类似。

由SELECT INTO OUTFILE方法备份的文件可以运行LOAD DATA INFILE语句来恢复数据表。示例:

将文件“/tmp/db_name/tbl_name.txt”中的数据加载到表tbl _ name

权限要求与上面描述的类似。在注入数据之前,数据表必须已经存在。如果担心数据会重复,可以添加REPLACE关键字来替换现有记录,或者用IGNORE关键字忽略它们。

补充:

shell & gtmysqldump-quick db _ name | gzip & gt;Db_name.contents.gz(本例中创建的文件是压缩格式的)。

恢复/转移到另一个站点的命令如下:

shell & gtgunzip & ltdb _ name.contents.gz | mysqldb _ name以上命令适用于*nix操作系统的机器。

4.启用二进制日志。

Binlog方式相对更灵活、省心、省力,还可以支持增量备份。

启用binlog时,必须重新启动Mysqld。首先,关闭mysqld,打开my.cnf,添加以下几行:

server-id = 1

log-bin = bin log

log-bin-index = binlog . index

然后启动mysqld。操作过程中将生成Binlog.000001和binlog.index。前一个文件是mysqld记录所有数据更新操作,后一个文件是所有binlog的索引,不能轻易删除。有关binlog的信息,请参考手册。

需要备份时,可以先执行SQL语句,让mysqld停止写入当前binlog,这样就可以直接备份文件,这样就可以达到增量备份的目的:

刷新日志;如果要备份复制系统中的从属服务器,还应该备份master.info和relay-log.info文件。

可以使用MySQL提供的工具mysqlbinlog查看备份的binlog文件,例如:

/usr/local/MySQL/bin/mysqlbinlog/tmp/bin log . 000001

这个工具可以让你显示指定数据库中的所有SQL语句,还可以限制时间范围,相当方便。详情请参考手册。

还原时,您可以使用类似下面的语句:

/usr/local/MySQL/bin/mysqlbinlog/tmp/bin log . 000001 | MySQL-uyejr-pye Jr db _ name

直接执行mysqlbinlog输出的SQL语句作为输入。

如果有备用机,不妨这样备份。作为从机,对机器的性能要求比较低,所以成本低。成本低,可以实现增量备份,分担部分数据查询压力。为什么不呢?

5、直接备份数据文件

与前面的方法相比,备份数据文件是最直接、最快速、最方便的,但缺点是基本不能实现增量备份。为了保证数据的一致性,需要在靠背文件之前执行以下SQL语句:

用读锁刷新表;即把内存中的数据全部刷新到磁盘,同时锁定数据表,保证复制过程中不会写入新的数据。这种方式备份的数据恢复起来也非常简单,可以直接拷贝回原来的数据库目录。

注意,对于Innodb类型表,还需要备份它的日志文件,即ib_logfile*文件。因为当Innodb表损坏时,您可以依靠这些日志文件来恢复。

6.备份策略

对于中等业务量的系统,可以确定如下备份策略:第一次全备份,每天一次增量备份,每周一次全备份,以此类推。对于一个重要而繁忙的系统,您可能需要每天进行一次完整备份,每小时进行一次增量备份,甚至更频繁。为了在不影响在线业务的情况下实现在线备份和增量备份,最好的方法是使用主从复制机制在从机上进行备份。

7、数据维护和灾难恢复

作为一个DBA(我还不是,呵呵),最重要的任务之一就是保证数据表能够安全、稳定、高速的使用。因此,您需要定期维护您的数据表。以下SQL语句非常有用:

检查表或修复表,以检查或维护MyISAM表。

优化表,优化MyISAM表

分析表格,分析MyISAM表格

当然,以上所有命令都可以通过使用工具myisamchk来启动,此处不赘述。

Innodb表可以通过执行以下语句进行碎片整理并提高索引速度:

ALTER TABLE TBL _ name ENGINE = Innodb;

这其实是一个空操作,看似什么都不做,实际上是重新排列碎片。

常用的MyISAM表可以通过上面提到的恢复方法来完成。如果索引损坏,可以使用myisamchk工具重建索引。对于Innodb表,这并不直接,因为它将所有的表保存在一个表空间中。但是,Innodb有一个检查机制,叫做模糊检查点。只要保存日志文件,就可以根据日志文件修复错误。您可以在my.cnf文件中添加以下参数,使mysqld在启动时自动检查日志文件:

innodb _ force _ recovery = 4

有关该参数的信息,请参考手册。

有点长了。慢慢来。应该对你有帮助。