数据库原理:数据库备份还原和日志管理
对一个企业或者公司来说,数据库中包含非常重要的信息。虽然数据库系统已经采取了系列措施来防止数据库的安全性和完整性遭到破坏,保证并发事务的正确执行,但数据库依然无法被保证绝对不受破坏。当数据文件发生损坏、数据库服务器出现故障、计算机硬件毁坏或者数据被误删时,数据库中的数据有可能全部或者部分丢失,因此,人们需要一种有效的方案来解决上述问题。数据库备份还原是对数据库进行备份,在数据丢失或者出现错误的情况下,利用数据库备份可以将数据库还原到某一正确状态下的版本。日志管理是对所有的操作进行记录,留下痕迹,以便数据库的备份与还原工作有据可循。此外,数据表之间的数据导出和导入技术,也为数据库提供了可靠的备份功能。
本章学习目标:了解数据库备份和数据库还原的基本概念,能够使用工具和在MySQL 中使用命令进行数据库备份和数据库还原; 了解日志的作用及日志的不同类型,能够使用语句进行日志的管理与查看。
一、备份和还原
1.1、备份还原概述
数据库备份还原是为了防止数据的丢失,或者在数据出现不满足一致性、完整性的时候,能够根据之前某一状态的数据库副本(数据库备份),将数据还原到这一状态之下的版本。数据库备份就是将数据库中的数据以及保证数据库系统正常运行的有关信息保存起来,以备数据库还原时使用。数据库还原是指加载数据库备份到系统中的进程。数据库备份还原是在本地服务器上进行的操作。
1.1.1、数据库备份的分类
从备份的内容角度,数据库备份可分为物理备份和逻辑备份。物理备份和还原操作都比较简单,能够跨MySQL版本,还原速度快。逻辑备份与还原操作都需要MySQL服务器进程参与。
(1)物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份,直接复制数据库文件进行备份。物理备份本质上就是文件的移动,恢复速度更快。
(2)逻辑备份:使用软件技术对数据库逻辑件(如表等数据库对象)的备份。逻辑备份导出的文件格式一般与原数据库的文件格式不同,只是原数据库中数据内容的一个映像。
从备份时服务器是否在线的角度,数据库备份可分为冷备份、温备份和热备份。
(1)冷备份(Cold Backup)指关闭数据库进行备份,能够较好地保证数据库的完整性。
(2)温备份(Warm Backup)指在数据库运行状态中进行操作,但仅支持读请求,不允许写请求。
(3)热备份( Hot Backup)指在数据库运行状态中进行操作,此备份方式依赖于数据库的日志文件,
从数据库的备份范围角度,数据库备份可分为完整备份、差异备份和增量备份。
(1)完整备份(Full Backup) :包含数据库中的全部数据文件和日志文件信息,也称为完全备份、海量备份或全库备份。由于完整备份需要对整个数据库进行备份,它需要花费更多的时间和空间,因此一般需要停止数据库服务器的工作,或者在用户访问量较少的时间段进行此项操作。完整备份是任何备份策略中都要完成的第一种备份类型,如果没有执行完整备份,就无法执行差异备份和增量备份。
(2)差异备份(Differential Backup) :只备份那些自上次完整备份之后被修改过的文件。它比完整备份小,优点是存储和还原速度快。备份的频率取决于数据的更新频率。需要注意的是,差异备份不能单独使用,要借助完整备份,所以它的前提是进行至少一次完整备份。
(3)增量备份(Incremental Backup) :只针对那些自上次完整备份或者增量备份后被修改过的文件。增量备份不能单独使用,要借助完整备份,备份的频率取决于数据的更新频率。
1.1.2、备份内容和备份时间
(1)备份内容:一个正常运行的数据库系统中,除用户数据库外,还有维护系统正常运行的系统数据库。因此,在备份数据库时,需要同时备份用户数据库和系统数据库,以保证系统还原能够正常操作。通常需要备份的数据包括数据、日志、代码、服务器配置文件等。
(2)备份时间:不同类型的数据库对备份的要求是不同的,对于系统数据库,一般在修改之后立即做备份比较合适。用户数据库发生变化的频率比系统数据库要高,所以不能采用立即备份的方式。对于用户数据库,一般采用周期性备份的方法,备份的频率与数据更改频率和用户能够允许的数据丢失量有关。
1.1.3、数据库还原及其注意事项
数据库还原(也称为数据库恢复)是与数据库备份相对应的系统维护和管理操作,当数据库出现故障时,将备份的数据库加载到系统,从而使数据库恢复到备份时的正确状态。系统进行数据库还原操作时,需要注意以下事项:
(1)要还原的数据库是否存在;
(2)数据库文件是否兼容;
(3)数据库采用了哪种备份类型。
1.2、备份和还原的方法
1.2.1、数据库备份和还原需要考虑的要素
数据库备份和数据库还原是两个互为一体的操作。数据库备份是为了完整、正确地进行数据库还原,数据库还原的基础是数据库备份。在进行数据库备份和还原时需要综合考虑用户需求、数据库特点,从而制订符合应用场景的数据库备份和还原策略。具体需要考虑以下要素:
(1)用户可以容忍丢失多长时间的数据;
(2)还原数据需要在多长时间内完成;
(3)数据库还原的时候是否需要持续提供服务;
(4)数据的更改频率;
(5)需要还原的数据量及数据内容(整个库、多个表或者单个表)。
1.2.2、MySQL数据库备份工具
MySQL支持使用工具进行数据库备份,这里着重对以下5种工具进行介绍。
(1) mysqldump:逻辑备份工具,适用于所有的存储引擎,支持温备份、完全备份、增量备份、差异备份。对于InnoDB存储引擎,musqldump还支持热备份。在Linux和UNIX环境下,用户可以使用crontab自动运行mysqldump命令;在Windows环境下,用户可以使用Windows任务调度程序自动运行mysqldump命令。
(2) cp、tar等归档复制工具:物理备份工具,适用于所有的存储引擎,支持冷备份、完全备份、增量备份、差异备份。
(3) Ivm2snapshot:借助文件系统管理工具进行备份。
(4) mysqlhotcopy:仅支持MyISAM存储引擎。mysqlhotcopy是一个Perl脚本。
(5) Xtrabackup: InnoDB/XtraDB热备份工具,支持完全备份、增量备份。
1.2.3、备份和还原策略
在进行数据库备份时,用户可以考虑以下策略。
(1)定期备份,周期应当根据应用数据库系统可以承受的恢复时间来确定。定期备份的时间应当在系统负载最低的时候进行。定期备份之后,同样需要定期做恢复测试,了解备份的正确可靠性,确保备份是有意义的、可恢复的。
(2)根据系统需要来定是否采用增量备份。增量备份所花的时间少,对系统负载的压力也小,缺点是恢复的时候需要加载之前所有的备份数据,恢复时间较长。
(3)在MySQL中打开log-bin选项,在做完整还原或者基于时间点的还原的时候都需要BINLOG。
(4)异地备份。
数据库还原通常采用以下两种策略:完全+增量+二进制日志;完全+差异+二进制日志。(注二进制日志的概念见10.6节)。
二、MySQL数据库备份
2.1、使用mysqldump命令备份
2.1.1、备份数据表
2.1.2、备份数据库
2.1.3、备份单表中的部分数据
2.2、使用工具备份
2.2.1、在MySQL Workbench中备份
2.2.2、使用mysqlhotcopy工具备份
2.2.3、使用SQLyog工具进行备份
三、MySQL数据库还原
3.1、使用命令进行数据库还原
3.2、使用工具进行数据库还原
四、MySQL数据库迁移
4.1、MySQL同类型数据库迁移
4.2、MySQL和其他数据库管理系统间的数据库迁移
五、数据库导出和导入
5.1、使用SQL语句导出和导入
5.2、使用命令导出和导入文件
六、MySQL日志管理
日志是MySQL数据库的重要组成部分,数据库运行期间的所有操作均记录在日志文件中。
例如,一个名为bfu的用户登录到MySQL服务器,日志文件中就会记录这个用户的登录时间、执行的操作等。再例如,MySQL服务在某个时间出现异常,异常信息会被记录到日志文件中。当数据遭到破坏发生丢失时,我们可以通过日志文件来查询出错原因,并且可以通过日志文件进行数据还原。对MySQL的管理工作而言,这些日志文件是不可缺少的。
6.1、日志的类型
MySQL有不同类型的日志文件,包括错误日志、二进制日志、通用查询日志及慢查询日志。除了二进制日志外,其他日志都是文本文件。
(1)错误日志:记录MySQL服务器启动和停止过程中的信息、服务器在运行过程中发生的故障和异常情况的相关信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息等。
(2)二进制日志:记录所有用户对数据库的操作(除SELECT语句之外)。当数据库发生意外时,通过此文件可以查看一定时间段内用户所做的操作,结合数据库备份技术即可实现数据库还原。二进制日志包含数据库备份后进行的所有更新,因此,在数据库发生故障时,利用二进制日志能够最大可能地更新数据库。
(3)通用查询日志:也称为通用日志,记录了用户的所有操作,包括对数据库的增加、删除、修改、查询等信息,在并发操作量大的环境下会产生大量的信息,从而导致不必要的磁盘/O,进而影响MySQL的性能。
(4)慢查询日志:记录查询时长超过指定时间的查询语句。
日志文件通常存储在MySQL数据库的数据库目录下。默认情况下,MySQL数据库只启动错误日志功能,其他类型日志都需要数据库管理员进行设置。但是,启动各种类型的日志功能都会降低MySQL数据库的执行速度,因此,数据库管理员需要综合考虑时间开销和日志的作用,来确定是否开启日志功能。
6.2、日志的作用
MySQL日志用来记录MySQL数据库的运行情况、用户操作和错误信息等。日志具有以下作用。
(1)如果MySQL数据库系统意外停止服务,数据库管理员可以通过错误日志查看出现错误的原因。
(2)数据库管理员可以通过二进制日志文件查看用户执行了哪些操作,从而根据二进制日志文件的记录来修复数据库。
(3)数据库管理员可以通过慢查询日志找出执行时间较长、执行效率较低的语句,从而对数据库查询操作进行优化。
6.3、错误日志管理
6.3.1、启用错误日志
错误日志功能在默认情况下是开启的,并且不能被禁止。通过修改my.ini文件中的log-err和log-warnings可以配置错误日志信息,其中log-err定义是否启用错误日志功能和错误日志的存储位置,log-warnings定义是否将警告信息定义至错误日志中。错误日志默认以hostname.err为文件名,其中hostname为主机名。错误日志的存储位置可以通过log-error选项来设置,在my.ini文件中进行修改的语法格式如下。
1 |
|
其中,path为日志文件所在的目录路径,filename为日志文件名。修改配置项后,需要重启MySQL服务才能生效。
6.3.2、查看错误日志
如果MySQL服务出现故障,数据库管理员可以在错误日志中查找原因。错误日志是以文本文件的形式存储的,可以直接使用普通文本工具打开查看。数据库管理员也可以通过SHOW命令查看错误日志文件所在的目录及文件名信息。
1 |
|
查询结果如表10-1所示。
Variable_name | Value |
---|---|
binlog_error_action | ABORT_SERVER |
log_error | .\DESKTOP-6R6HANK.err |
log_error_services | log_filter_internal;log_sink_internal |
log_error_suppression_list | |
log_error_verbosity | 2 |
从表10-1可看出,本书作者的计算机中,错误日志的文件名为"DESKTOP-6R6HANK.err",用文本工具打开错误日志文件,可以看到错误日志记录了系统的一些错误和警告信息,如图10-15斤示。
6.3.3、删除错误日志
数据库管理员可以删除早期的错误日志,这样可以保证MySQL服务器上的硬盘空间。在MySQL数据库中,数据库管理员可以使用mysqladmin命令来开启新的错误日志。mysqladmin命令的语法格式如下。
1 |
|
执行命令后,数据库系统会自动创建一个新的错误日志。旧的错误日志仍然保留,只是已经更名为filelame.err-old。
在客户端登录MySQL数据库后,可以执行下面的flush logs语句。
1 |
|
对于早期的错误日志,数据库管理员查看这些错误日志的可能性不大,因此,当不再需要这些文件时,数据库管理员可以通过SHOW命令查看错误日志文件所在的位置,然后删除即可。
6.4、二进制日志管理
二进制日志是MySQL中最重要的日志,记录了除SELECT语句之外所有的DDL,也称为变更日志。二进制日志包含两类文件:一是二进制日志索引文件,文件名后缀为.index,该文件用于记录所有的二进制文件;二是二进制日志文件,文件名后缀为.00000*,该文件记录了数据库所有的DDL和DML语句。使用二进制日志的主要目的是最大可能地恢复数据,因为二进制日志包含备份后进行的所有更新。默认情况下,MySQL是不开启二进制日志功能的。
6.4.1、开启二进制日志
二进制日志开启后,所有对数据库的操作均会被记录到二进制日志文件中,所以长时间开启之后,二进制日志文件会变得很大,占用大量磁盘空间。查看二进制日志是否开启的命令如下。
1 |
|
通过my.ini文件中的log-bin选项可以开启二进制日志,具体语法格式如下。
1 |
|
其中,log-bin定义开启二进制日志,path表示日志文件所在的目录路径,filename为日志文件的文件名,文件全名如filename.000001或者filename.000002等,每次重启MySQL服务后,都会生成一个新的二进制日志文件,这些日志文件的number(如000001)会不断递增;expire_logs_days定义定期清除过期日志的时间、二进制日志自动删除的天数,默认值是0,表示“没有自动删除”;max_binlog_size用于对单个文件的大小进行限制,如果二进制日志写入的内容大小超出给定值,日志就会发生滚动,也就是关闭当前文件,重新打开一个新的日志文件(文件大小默认值是1GB,设置时不能将该值设置为小于4096B或大于1GB)。
在my.ini文件中配置完成之后,启动MySQL服务进程,即可启动二进制日志。二进制日志默认存储在数据库的数据目录下,默认的文件名为hostname-bin.number,其中hostname表示主机名。
6.4.2、查看二进制日志
使用SHOW命令可以查看二进制日志是否开启,如果结果为ON,则表明开启了二进制日志,如图10-16所示。
使用show binary logs可以查看目前有哪些二进制日志文件。由于log-bin是以binary方式存取的,所以不能直接在Windows下查看,但可以通过MySQL提供的mysqlbinlog工具查看。
1 |
|
命令执行窗口如图10-17所示。
数据库管理员也可以通过SHOW命令查看用户对数据库的操作,如下所示。
1 |
|
执行上述命令,结果如表10-2所示。
Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
---|---|---|---|---|---|
DESKTOP-TKC62RP-bin.000005 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.23, Binlog ver: 4 |
DESKTOP-TKC62RP-bin.000005 | 125 | Previous_gtids | 1 | 156 | |
DESKTOP-TKC62RP-bin.000005 | 126 | Stop | 1 | 179 |
通过二进制日志文件的内容可以看出对数据库操作的记录,这给数据库管理员对数据库进行管理或数据库恢复提供了依据。如果数据库管理员想查看SELECT查询过程,可以使用查询日志。
6.4.3、删除二进制日志
二进制日志文件记录了大量的内容,如果很长时间不清理,将会对存储空间造成浪费。二进制日志文件不能直接删除,如果使用rm删除可能会导致数据库崩溃,通常使用purge命令删除。使用purge命令删除日志的语法格式如下。
1 |
|
此外,数据库管理员可以使用reset master删除所有的二进制日志文件。使用reset master删除所有二进制日志文件之后,MySQL将会重新创建二进制日志文件,新的二进制日志文件重新从000001开始编号。
【例10-16】删除指定编号000004前的所有日志。
1 |
|
上述命令执行完毕后通过SHOW命令查看二进制日志文件,可以看到,DESKTOP-TKC62RP-bin.000004之前的日志文件已经被删除,如表10-3所示。
Log_name | File_size | Encrypted |
---|---|---|
DESKTOP-TKC62RP-bin.000004 | 179 | NO |
DESKTOP-TKC62RP-bin.000005 | 179 | NO |
DESKTOP-TKC62RP-bin.000006 | 179 | NO |
DESKTOP-TKC62RP-bin.000007 | 179 | NO |
DESKTOP-TKC62RP-bin.000008 | 179 | NO |
DESKTOP-TKC62RP-bin.000009 | 179 | NO |
DESKTOP-TKC62RP-bin.000010 | 179 | NO |
DESKTOP-TKC62RP-bin.000011 | 179 | NO |
DESKTOP-TKC62RP-bin.000012 | 156 | NO |
DESKTOP-TKC62RP-bin.000013 | 15861 | NO |
【例10-17】删除指定时间2021-03-04 11:30:00之前产生的所有日志。
1 |
|
上述命令执行完成之后,2021-03-04 11:30:00之前创建的所有二进制日志将被删除。
6.4.4、使用二进制日志还原数据库
如果数据库遭到意外损坏,首先应该使用最近的备份文件来还原数据库。但在最近一次备份之后,数据库可能还进行过一些更新,这可以使用二进制日志来还原。在数据库意外丢失数据时,数据库管理员可以使用mysqlbinlog工具从由指定时间点开始(例如最后一次备份)直到现在或另一个指定时间点的日志中恢复数据。数据库管理员首先需要获得当前二进制日志文件的路径和文件名,一般可以从配置文件中找到路径。使用mysqlbinlog还原数据库的命令如下。
1 |
|
option是一些可选的选项,其中比较重要的参数是–star-date、–stop-date和–start-position、–stop-position。–start-date、–stop-date指定数据库恢复的起始时间点和结束时间点;–start-position、–stop-position指定恢复数据库的开始位置和结束位置。filename是日志文件名。
【例10-18】使用mysalbinloo恢复数据库到2021年3月10日10:00: 00的状态。
1 |
|
该命令执行成功后,系统会根据.000005日志文件恢复2021年3月10日10:00:00以前的所有操作。使用mysqlbinlog命令进行还原操作时,必须是编号小的先还原,比如000001必须在000002之前还原。
6.5、慢日志管理
慢查询日志记录了执行时间超过特定时长的查询,即记录所有执行时间超过最大SQL执行时间(long_query_time)或未使用索引的语句。分析这些语句执行时间超过特定时长的原因,可以优化MySQL的管理。
6.5.1、启用慢查询日志
慢查询日志在MySQL中默认是关闭的,可以通过配置文件my.ini或者my.cnf中的slow_query_log选项打开。开启慢查询日志的语法格式如下。
1 |
|
其中,path为日志文件所在的目录路径,如果不指定目录和文件,默认存储在数据目录中,文件为hostname-slow.log, hostname是MySQL服务器的主机名。long_query_time选项指定时间阈值,如果某条查询语句的查询时间超过了这个值,那么查询过程将会被记录到慢查询日志文件中,参数"n"是时间值,单位是秒,如果不设置long _ query time选项,默认时间是10s。
另外,数据库管理员还可使用命令行开启慢查询日志,具体设置命令如下。
1 |
|
设置完成之后,可以通过show命令查看设置情况。
1 |
|
查询结果如图10-18所示。
6.5.2、查看慢查询日志
执行时间超过指定时间的查询语句会被记录到慢查询日志中。如果数据库管理员想知道哪些查询语句的执行效率低,那么其可以从慢查询日志中获得想要的信息。通过前面的设置,我们可以看到在默认文件夹下生成了一个名为DESKTOP-TKC62RP-slow.log的慢查询日志文件,我们可以使用记事本来查看该文件,如图10-19所示。
该文件记录了慢查询日志发生的时间、连接用户、IP、执行时间、锁定时间、最终发送行数、总计扫描行数、SQL语句等相关信息。如果只需要查询某些变量,可以通过下面的语句进行查看。
1 |
|
当查询时间大于所设置的long_query_time时,可通过mysqldumpslow工具进行汇总、排序,以便找出耗时最高、请求次数最多的慢查询日志。
6.5.3、删除慢查询日志
当需要删除慢查询日志时,通常通过以下语句来重置慢查询日志文件。
1 |
|
重置后需要生成一个新的慢查询日志文件。
1 |
|
数据库管理员也可以使用mysqladmin命令来删除,具体的语法格式如下。
1 |
|
执行该命令后,新的慢查询日志会直接覆盖旧的慢查询日志,不需要再手动删除。数据库管理员也可以手动删除慢查询日志,删除之后需要重新启动MySQL服务,重启之后就会生成新的慢查询日志。
6.6、通用日志管理
通用日志也称为通用查询日志,在并发操作多的环境下会产生大量的信息,从而导致不必要的磁盘I/O,影响MysOL的性能。通用日志记录用户的所有操作,包括启动和关闭MySQL服务、更新语句、查询语句等。
6.6.1、开启通用日志
通用日志默认是关闭的,可以通过修改my.ini文件的log选项来开启。修改的语法格式如下。
1 |
|
其中,path用来指定日志存放的位置,filename定义日志文件名,默认以主机名hostname作为文件名,日志文件存放在MySQL数据库的数据文件夹下。
登录MySQL服务器后,也可以用语句来启动通用日志,开启通用日志的语法格式如下。
1 |
|
通过SHOW语句可以查看通用日志的开启情况。
1 |
|
如果开启成功,我们将会在语句执行结果中看到general_log的值为ON。
需要停止通用日志时,只需要把my.ini文件中的general_log设置为0,然后重新启动MySQL 服务即可。
6.6.2、查看通用日志
通用日志以文本文件的形式存储,在Windows操作系统中可以使用文本编辑器进行查看,在Lux操作系统中可以使用Vim工具或者gedit工具进行查看。通过SHOW命令显示通用日志文件所在的位置和文件名之后,打开日志文件,即可查看日志文件的内容。
6.6.3、删除通用日志
如果数据库的使用非常频繁,那么通用日志将会占用非常大的磁盘空间。数据库管理员可以删除很长时间之前的通用日志,以保证MySQL服务器上的硬盘空间。在MySQL数据库中,数据库管理员可以使用mysqladmin命今来开启新的通用日志,新的通用日志会直接覆盖旧的通用日志,不需要再手动删除。命令的语法格式如下。
1 |
|
数据库管理员也可以在登录MySOL服务器之后,输入以下语句来删除通用日志。
1 |
|
如果希望备份旧的通用日志,那么必须先将旧的日志文件复制出来或者改名,然后再执行上面的命令。除了上述方法,数据库管理员还可以手动删除通用查询日志。删除之后需要重新启动MySQL服务,重启之后就会生成新的通用日志。
删除通用日志和慢查询日志使用的是同一个命令,所以在使用时一定要注意,一旦执行这个命令,那么通用日志和慢查询日志都将只存在新的日志文件中。
七、小结
数据库的备份和还原是MySQL运行维护的重要工作内容。数据库备份还原是为了防止数据丢失,或者在数据出现不满足一致性、完整性的时候,能够根据之前某一状态的数据库副本(数据库备份),将数据库还原到这一状态之下的版本。在MySQL中,用户可以使用命令或工具来对数据库进行备份和还原。
本章还介绍了数据库迁移和导入导出的方法,以保证在数据库服务器更新或者数据库管理系统发生变更时能够最大化地将原来的数据库迁移到新的数据库服务器或新的数据库系统中。
日志是MySQL数据库的重要组成部分,数据库运行期间的所有操作均记录在日志文件中。使用日志可以查看用户对数据库进行的所有操作,也可以帮助进行数据库还原和数据库优化。MySQL中的日志分为错误日志、二进制日志、通用日志和慢查询日志4种,其中二进制日志的查询方法与其他日志不同,读者需要特别注意。开启日志需要消耗一定的存储空间,也会影响MySQL的性能,对于早期的日志文件要注意及时删除。