您的位置:首页 > 数据库 > MySQL

Mysql备份与恢复

2017-12-05 21:02 239 查看
备份数据库是很重要的,这样您就可以恢复数据,并在出现问题时重新启动并重新运行,比如系统崩溃、硬件故障或用户错误地删除数据。备份在升级MySQL安装之前是必不可少的,它们可以用于将MySQL安装转移到另一个系统或设置复制从服务器。

备份类型

物理备份

物理备份包括存储数据库内容的目录和文件的原始副本。这种备份类型适合当问题发生时需要快速回复的大型的,重要的数据库。

备份方法的特征:

1. 备份由数据库目录和文件的精确副本组成。通常这是MySQL数据目录的全部或部分副本。

2. 物理备份方法比逻辑备份方法更快,因为物理备份只是拷贝文件而没有转化。

3. 备份结果比逻辑备份更紧凑。

4. 由于备份的速度和紧凑型对于繁忙的数据库非常重要,所以MySQL企业备份产品执行物理备份。

5. 备份和恢复的粒度范围从整个数据目录级别到单个文件级别。根据存储引擎的不同,这可能提供表级别的粒度。

6. 除了数据库之外,备份可能还包含一些如日志或配置文件等的文件。

7. 来自内存表的数据很难备份,因为他们的内容不是存储在磁盘上的。(MySQL企业备份产品有一个特性,可以在备份期间从内存表中检索数据。)

8. 备份仅对具有相同或相似硬件特征的其他机器是可移植的。

9. 备份可以在MySQL服务器不运行时执行。如果服务器运行,则需要执行适当的锁定,以便服务器在备份期间不改变数据库内容。MySQL企业备份对它需要的表自动执行此锁。

10. 物理备份工具包括用于InnoDB或其他表的MySQL企业备份工具mysqlbackup,文件系统级命令(如cp,scp,tar,rsync)或MyISAM表的工具mysqlhotcopy。

11. 恢复逻辑备份数据:

- MySQL企业备份恢复了InnoDB和它备份了的其他表.

- ndb_restore恢复NDB表.

- 在文件系统级别或mysqlhotcopy的文件拷贝能够用文件系统命令复制它们到原始位置.

逻辑备份

逻辑备份保存以逻辑数据库结构表示的信息(create database,create table语句)和内容(insert语句或限制文本文件)。这种类型的备份适合:可以在其中编辑数据值、表结构、或者在不同的机器上重新创建数据的较小的数据库。

备份方法的特征:

1. 备份是通过查询MySQL服务器获得数据库结构和内容信息来完成的。

2. 因为备份必须访问数据库信息并将其转换为逻辑格式,所以比物理方法慢。如果输出是被传输到客户端,那么服务端也必须将其发送到备份程序。

3. 输出比物理备份要大,尤其是在以文本格式保存的情况下。

4. 备份和恢复粒度在服务器级别,数据库级别(所有数据库),表级别(特定数据库上的所有表)上都是可用的。无论存储引擎如何,这都是正确的。

5. 该备份不包括日志或配置文件,或其他不是数据库部分的数据库相关文件。

6. 以逻辑格式存储的备份是与机器无关的,且高度可移植的。

7. 逻辑备份一定是在MySQL服务运行时执行的。服务器并不是离线的。

8. 逻辑备份工具包括mysqldump程序和
select ... into outfile
语句。这些工具是用于任何的存储引擎,甚至是MEMORY。

9. 为了恢复逻辑备份,可以使用mysql客户端处理sql格式的转储文件。用
LOAD DATA INFILE
语句或mysqlimport客户端来加载分割文本文件(delimited-text files)。

在线备份

在线备份是在MySQL服务器运行时进行的,以便从运行的服务器上获取数据库信息。

备份方法的特征:

1. 在线备份在备份期间连接到MySQL服务器且依赖它们的需要执行操作访问数据库,这对其他客户端没有太大的干扰。

2. 为了在完整性备份上不会发生数据的修改,必须小心谨慎地使用适当的锁。MySQL企业备份产品自动执行这种锁。

离线备份

离线备份是在服务器停止时进行。

备份方法的特征:

1. 因为在备份期间服务器不可以,所有可能会影响到客户端。出于这个原因,这样的备份通常是在不损毁可用性的情况下从一个slave服务器的副本中离线获取。

2. 因为不存在客户端活动的干扰,备份过程是很简单的。

本地备份

本地备份是指备份动作是在服务器运行的机器上执行。

mysqldump工具可以连接到本地或者远程服务器。对于SQL输出(create和insert语句),可以执行本地和远程转储,且在客户机上产生输出。对于分割文本输出(使用–tab选项 ),将在服务器主机上创建数据文件。

mysqlhotcopy仅用于本地备份:首先连接到服务器,将其锁定在数据修改之后,再复制本地表文件。

SELECT ... INTO OUTFILE
可以从本地或远程客户端发起,在服务器主机上生成输出文件。

物理备份方法通常是在MySQL服务器主机上启动,这样服务器就可以离线使用,尽管复制文件的目的可能是在远程。

远程备份

远程备份是指备份动作不在服务器运行的机器上执行。

mysqldump工具可以连接到本地或者远程服务器。对于SQL输出(create和insert语句),可以执行本地和远程转储,且在客户机上产生输出。对于分割文本输出(使用–tab选项 ),将在服务器主机上创建数据文件。

SELECT ... INTO OUTFILE
可以从本地或远程客户端发起,在服务器主机上生成输出文件。

快照备份

一些文件系统的实现启动了“快照”。这些提供了在给定时间点,不需要对整个文件系统进行物理复制的文件系统的拷贝副本。(例如实现可以使用copy-on-write技术,这样只需要拷贝在快照时间点之后修改的这部分文件系统。)MySQL本身并没有文件系统快照的功能,它是通过第三方解决方案实现的,如Veritas、LVM或ZFS提供。

全量备份

全量备份包括在给定时间点上MySQL服务器管理的所有数据。MySQL有不同的方式去执行全量备份,比如在前面部分提供的。

增量备份

增量备份包括在给定时间段内进行更改的数据(从某个时间点到另一个时间点)。通过启用服务器的二进制日志,记录数据的更改来实现增量备份。

恢复类型

全量恢复

全量恢复是从全量备份中完整的恢复所有数据。这将服务器实例恢复到备份时的状态。如果状态不是完整的最新状态,那么在全量备份恢复之后跟着恢复在全量备份之后所作的增量备份,从而将服务器提升到一个最新的状态。

增量恢复

增量恢复是恢复在给定时间内所作的更改。这样被称为点时间恢复,是因为它使服务器的状态回到给定的时间点状态。时间点恢复是基于二进制日志的,通常是将服务器恢复到在备份文件备份时服务器状态的完整恢复。然后,在二进制日志文件中写入的数据更改被应用为增量恢复,以重做数据修改,并使服务器达到所需的时间点。

备份方法

用MySQL企业备份产品进行热备份

MySQL企业版用户可以使用MySQL企业备份产品去做整个数据库实例或者指定的数据库、表,或者数据库和表进行物理备份。这个产品的特征包括增量和压缩备份。物理备份数据库文件要比诸如mysqldump命令之类的逻辑技术要快的多。InnoDB表的拷贝用的是热备份机制。(理想情况下,InnoDB表应该代表实质多数的数据。)

来自其他存储引擎表的复制用的是热备份机制。

mysqldump程序和mysqlhotcopy脚本能够实现备份

因为mysqldump能够备份所有种类的表,所有他更通用。而mysqlhotcopy仅使用于一些存储引擎。

mysqldump选项有

--all-databases #脚本中包含create database和use database,
--database #脚本中包含create database和use database,
--add-drop-database #脚本中包含drop database在create database前
--events #事件调度器事件
--routines #存储过程和函数
--triggers #表的触发器
--skip-events #禁用事件调度器事件
--skip-routines #禁用存储过程和函数
--skip-triggers #禁用表触发器
--no-data #不导出数据,仅有创建表的语句
--no-create-info #不导出创建表语句,仅导出表数据


备份

shell> mysqldump --all-databases > dump.sql # 导出所有的数据库
shell> mysqldump --databases db1 db2 db3 > dump.sql #导出数据库db1,db2,db3
shell> mysqldump test t1 t3 t7 > dump.sql #导出test数据库中的t1,t3,t7表


恢复1

shell> mysql < dump.sql #在shell终端执行
mysql> source dump.sql #在mysql客户端执行
shell> mysqladmin create db1
shell> mysql db1 < dump.sql


恢复2

mysql> CREATE DATABASE IF NOT EXISTS db1;
mysql> USE db1;
mysql> source dump.sql


通过拷贝文件备份

对于使用自己的文件表示每个表的存储引擎,可以通过复制这些文件来备份表。如MyISAM表被存储成文件,因此通过拷贝文件(
*.frm,*.myd,和*.myi文件
)很容易实现备份。为了获得一致的备份,请停止服务器或者锁定并刷新相关表。
FLUSH TABLES tbl_list WITH READ LOCK;
你只需要一个读锁;这使你在数据库目录中复制文件时其他客户端还能继续查询表。在你备份前,请通过刷新将所有活动的索引页写到磁盘上。

只要服务器不更新任何内容,你也可以通过复制所有表文件来创建二进制备份。mysqlhotcopy脚本就使用的这个方法。(但是请注意,这种文件复制的方法对于包含InnoDB表的数据库是无效的。mysqlhotcopy并不适用于InnoDB表,因为InnoDB未必在数据库目录中存储表内容。而且,即使服务器没有积极地更新数据,InnoDB可能仍有缓存在内存中且没有刷新到磁盘上的被修改数据。)

使用分割文本文件备份

你可以通过
select * into outfile 'file_name' from tbl_name;
来创建包含表数据的文本文件。文件被创建在MySQL的服务器主机上,而不是在客户端主机上。对于该语句,输出文件不可能存在,因为允许文件被覆盖构成了一个安全风险。可以用
load data infile 或者 mysqlimport
去加载分割文件的数据备份文件。

备份

shell> mysqldump --tab=/tmp --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1


恢复1

shell> mysqlimport --fields-terminated-by=, --fields-enclosed-by='"' --lines-terminated-by=0x0d0a db1 t1.txt


恢复2

mysql> USE db1;
mysql> LOAD DATA INFILE 't1.txt' INTO TABLE t1 FIELDS TERMINATED BY ',' FIELDS ENCLOSED BY '"' LINES TERMINATED BY '\r\n';


通过二进制日志实现增量备份

MySQL通过在你启动服务器时用–log-bin选项启动二进制日志来实现增量备份。二进制日志文件提供了,在你执行备份之后的时间内数据库改变的信息,用于复制数据库改变。在您想要进行增量备份(包含自上一个完整或增量备份以来所发生的所有更改)时,您应该使用
flush logs
来旋转二进制日志。完成后,您需要将所有二进制日志复制到备份位置,这些日志的范围从上一次完整或增量备份的最后一个时刻到最后一个。

通过复制slaves来实现备份

如果您在主服务器上进行备份时存在性能问题,一个策略是帮助您建立slave服务器并对其执行备份,而不是在主服务器上执行备份。If you are backing up a slave replication server, you should back up its master info and relay log info repositories when you back up the slave’s databases, regardless of the backup method you choose.These information files are always needed to

resume replication after you restore the slave’s data. If your slave is replicating LOAD DATA INFILE

statements, you should also back up any SQL_LOAD-* files that exist in the directory that the slave

uses for this purpose. The slave needs these files to resume replication of any interrupted LOAD DATA

INFILE operations. The location of this directory is the value of the –slave-load-tmpdir option.

If the server was not started with that option, the directory location is the value of the tmpdir system

variable.

恢复破坏的表数据

如果你要恢复已经损坏的MyISAM表,首先尝试用
REPAIR TABLE
或者
myisamchk -r
来恢复它们。这在99.9%的情况下都是有效的。如果myisamchk失败了,请参考 MyISAM Table Maintenance and Crash Recovery.

使用文件系统快照来备份

如果你使用的是Veritas文件系统,你可以做这样的备份:

1. 在客户端执行
FLUSH TABLES WITH READ LOCK
.

2. 在另一个shell执行
mount vxfs snapshot
.

3. 在第一个客户端执行
UNLOCK TABLES
.

4. 从快照拷贝文件.

5. 卸载快照.

类似的快照功能可以在其他文件系统中使用,比如LVM或ZFS。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息