mysql如何备份和恢复数据库
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
有关该参数的信息,请参考手册。
有点长了。慢慢来。应该对你有帮助。