本文地址:https://www.askmac.cn/archives/mysql-generate-binary-bk.html
11.3.1 建立MyISAM的Binary备份
为了对MyISAM表建立一份binary备份,可以拷贝对应表的.frm,.MYD和.MYI文件。当你这么做时,必须确保这些表在被拷贝时没有在被其它程序(包括服务端)所使用。如果你在拷贝表前就关停了服务端,那就没什么问题了。如果拷贝的时候服务端还在运行,那就需要使用适当的锁来避免服务端对这些表的访问。例如,拷贝world数据库中的Country表前,进行锁表并将有待永久保存的变更刷出内存操作:
mysql> use world; mysql> lock tables Country read; mysql> flush tables Country;
然后(在表被锁住的情况下)使用操作系统文件拷贝命令将表文件拷贝出来。
以MyISAM数据库表world.Country拷贝举例(这里假设Country表为MyISAM引擎表):
# cp /usr/local/mysql/data/world/Country.frm /var/backup/Countryfrm # cp /usr/local/mysql/data/world/Country.MYI /var/backup/CountryMYI # cp /usr/local/mysql/data/world/Country.MYD /var/backup/CountryMYD # cp /usr/local/mysql/data/world/Country.TRN /var/backup/CountryTRN # cp /usr/local/mysql/data/world/Country.TRG /var/backup/CountryTRG # cp /usr/local/mysql/data/mysql/proc /var/backup/CountryROUTINES
在拷贝操作完成后,释放表锁:
mysql> unlock tables;
之前的方法可以用于Unix/Linux系统上的数据库文件备份。在Windows上,被服务端锁住的表文件则由于文件锁原因而不能被拷贝备份。在这样情况下,你就必须在拷贝表文件前关闭服务端。
另一种MyISAM二进制备份方式是使用mysqlhotcopy脚本工具,它可以帮你锁表并拷贝文件。
如果需要从二进制备份中恢复一张MyISAM表,则停止服务端,拷贝备份表文件到对应正确的数据库目录中,并启动服务端即可。
11.3.2 建立InnoDB的Binary备份
对于InnoDB来说,进行完整的二进制备份操作是基于对InnoDB使用并管理的表空间下的所有文件(InnoDB表空间中的所有表)的备份拷贝。
对于InnoDB(Unix/Linux),以world数据库Country表的备份举例:
# cp /usr/local/mysql/data/ib_logfile0 /var/backup/CountryInnodbLogs0 # cp /usr/local/mysql/data/ib_logfile1 /var/backup/CountryInnodbLogs1 # cp /usr/local/mysql/data/ibdata1 /var/backup/CountryInnodbTableSpace # cp /usr/local/mysql/data/world/Country.frm /var/backup/Countryfrm # cp /private/etc/my.cnf /var/backup/my.cnf
为了建立这样一份二进制备份,你需要遵照以下步骤来执行:
- 在进行拷贝操作的时候停止服务端的运行。当正在进行表空间文件拷贝时,保证表空间必须不被使用。
- 保证服务端在关闭时没有报错。Binary InnoDB备份要求一个干净的关闭以确认服务端已经将所有待处理(pending)的事务完成。
- 对以下每个组件进行拷贝:
- 每个InnoDB对应的.frm文件
- 表空间文件。这包括了共享表空间中的文件。它也包括了那些单独的.ibd文件(如果你为InnoDB启用了
--innodb_file_per_table
的命令项,每个表一个表空间)。 - InnoDB日志文件。
- InnoDB配置项,如存储在配置文件中的那些命令项。你可能需要这些配置项来从各个位置恢复备份。在此例中,你需要知道表空间和日志文件最初建立的位置。
- 重启服务端。
其它建立binary InnoDB备份的方法还有使用InnoDB Hot Backup.
为了恢复InnoDB表空间,你需要使用其二进制备份,同时关闭服务端,替换所有之前时被备份的部分,之后重启服务端。
如果你希望使用一个二进制InnoDB备份,来将InnoDB表复制到另一个服务端下,你就需要满足以下要求。注意,表空间文件是以成组的单元来拷贝的,这也意味着进行恢复操作时,你需要去替换目标服务端下任意已存的表空间文件。你不能通过binary备份来在目标服务端中增加一个表空间。
还有一种建立备份的方法是以文本格式导出表内容(例如,使用mysqldump)。如果二进制备份无法满足不同系统间的迁移条件的话,这种方式可以将单独的InnoDB表从一个服务端拷贝到另一个上,非常有用。它同样可用将表新加到另外的表空间中:运行mysqldump来导出表内容至文本文件,然后使用mysql客户端将文本文件内容倒入到目标服务端。
11.3.3 其它Binary备份工具
这里描述的工具程序如mysqlhotcopy和InnoDB Hot Backup,都是针对特殊目的而使用的程序,它们对应特定的存储引擎来进行二进制备份。
mysqlhotcopy脚本:
mysqlhotcopy脚本会将表拷贝到一个备份目录中。它是一个perl脚本并需要已安装DBI模块。它可运行在Unix/Linux环境并对MyISAM表进行备份处理。请注意这个脚本不能对InnoDB表进行操作。
mysqlhotcopy会连接到本地MySQL服务端,锁表以保证服务端不会修改它们,flush表保证待保存的修改被写入磁盘,然后开始拷贝表文件。当它完成了拷贝操作后,解锁表。
mysqlhotcopy必须运行于服务端,这样才能进行针对表的拷贝操作。它也必须在服务端运行的时候处理成功,因为其需要连接到服务端来锁表并flush表。
由于mysqlhotcopy直接对表文件进行拷贝,而不是通过网络进行的备份,因此操作处理速度很快。而且脚本中会按照步骤来执行锁表和flush表语句,而不需要你一句一句手工键入命令。更加方便。
mysqlhotcopy在使用时有许多命令项可用,你可以通过 --help
项来查看。以下显示了一些简单实用mysqlhotcopy例子:
备份MyISAM表库world123到目录/tmp/world123_tmp下:
shell> mysqlhotcopy world123 /tmp/world123_tmp --user=root --password=dbdao.com --socket=/tmp/mysql.sock
仅备份world123库中表名包含Country的表:
shell> mysqlhotcopy world123./Country/ /tmp/world123_tmp --user=root --password=dbdao.com --socket=/tmp/mysql.sock
InnoDB Hot Backup:
InnoDB Hot Backup程序(ibbackup)作为Oracle(Innobase Oy被Oracle收购后)过去的商用备份产品(后融入mysqlbackup)。它可以在不妨碍数据库正常运行活动的情况下,对InnoDB表进行备份操作。这个工具同时支持Unix和Windows操作系统。
二进制备份可移植性的条件:
当你希望将一份服务器上的二进制备份用于另一台具有不同架构的服务器上的话,那么二进制的可移植性就很重要了。例如,使用binary备份就是一种将数据库从一个MySQL服务端拷贝到另一个上的方法。
对于MyISAM, 二进制可移植性意味着你可以直接拷贝MyISAM表文件从一个服务端到另一个不同的主机上且这台主机的服务端可以对这些表进行访问。
对于InnoDB,二进制可移植性意味着你可以直接从一个MySQL服务端将表空间文件整体拷贝到另一个机器中,而其上的服务端可以对这个表空间进行访问。默认情况下,所有InnoDB表都会被组织在一起,存放在表空间中,因此表空间的可移植性代表了是否所有独立的InnoDB表可移植与否的标志。如果其中有一个InnoDB表不可移植,则表空间也就不可移植。
当以下两个条件满足后,MyISAM表和InnoDB表空间可以实现二进制可移植性:
- 两台机器都必须使用二进制补码整数运算方式(two’s-complement integer arithmetic)
- 两台机器除非都不使用浮点列(FLOAT或DOUBLE),否则其浮点列都必须使用IEEE浮点格式。
在实际应用中,这两个前提条件几乎不会有什么限制。因为二进制补码整数运算和IEEE浮点格式在现代硬件中都是作为标准规范实现的。
对于InnoDB二进制可移植性的第三个条件是你应该对数据库和表都使用小写来命名。这是因为InnoDB在Windows上内部(在数据字典中)是以小写存放命名的。使用小写可以允许在Windows和Unix之间具有二进制可移植性**。
[mysqld] lower_case_table_names=1
** 注意,这里没有考虑系统之间的大小端(Endian)存储情况,如果两台机器系统大小端不一致,那么,移植前需要考虑转码。
如果你配置InnoDB以每个表一个表空间进行存储,那么对于二进制可移植性的条件针对对象也同样包括了InnoDB表的.ibd文件(同时对于共享表空间,由于其包含有关于InnoDB表的数据字典信息,因此也需要满足上述条件)。
如果不满足二进制可移植性条件,那么你也可以通过使用文本格式来导出MyISAM或InnoDB表数据(如使用mysqldump),并拷贝到另一个服务器中,再在目标端中进行导入操作。
Comment