备份与恢复

数据库备份与恢复的概念

为保证数据库的可靠性和完整性,数据库管理系统通常会采取各种有效的措施来进行维护。尽管如此,在数据库的实际使用过程中,仍然存在着一些不可预估的因素,会造成数据库运行事务的异常中断,从而影响数据的正确性,甚至会破坏数据库。使数据库中的数据部分或全部丟失。 这些因素可能是:

  • 计算机硬件故障。由于用户使用的不当,或者硬件产品自身的质量问题等原因,计算机硬件可能会出现故障,甚至不能使用。如硬盘损坏会导致其存储的数据丟失。
  • 计算机软件故障。由于用户使用的不当,或者软件设计上的缺陷,计算机软件系统可能会误操作数据,从而引起数据破坏。
  • 病毒。破坏性病毒会破坏计算机硬件、系统软件和数据。
  • 人为误操作。例如,用户误使用了 DELETE、UPDATE 等命令而引起数据丟失或破坏;一条简单的 DROP TABLE 或者 DROP DATABASE 语句就会让数据表化为乌有;更危险的是 DELETE * FROM table_name 能轻易地清空数据表。这些人为的误操作是很容易发生的。
  • 自然灾害。火灾、洪水、地震等这些不可抵挡的自然灾害会对人类生活造成极大的破坏,也会毀坏计算机系统及其数据。
  • 盗窃。一些重要数据可能会被窃或人为破坏。

面对这些可能的因素会造成数据丟失或被破坏的风险,数据库系统提供了备份和恢复策略来保证数据库中数据的可靠性和完整性。

数据库备份是指通过导出数据或者复制表文件的方式来制作数据库的副本。数据库的恢复是以备份为基础的,它是与备份相对应的系统维护和管理操作,当数据库出现故障或遭到破坏时,需要人工将最新的数据库备份加载到系统,从而使数据库从错误状态恢复到备份时的正确状态。系统进行恢复操作时,先执行一些系统安全性的检查,包括检查所要恢复的数据库是否存在数据库是否变化及数据库文件是否兼容等,然后根据所采用的数据库备份类型采取相应的恢复措施。

另外,通过备份和恢复数据库,也可以实现将数据库从一台服务器移动或复制到另一台服务器的目的。

MySQL 数据库备份与恢复的方法

MySQL 数据库中的备份和恢复组件为存储在 MySQL 数据库中的关键数据提供了重要的保护手段。

使用 SQL 语句备份和恢复表数据

在 MySQL 5.5 中,可以使用 SELECT INTO...OUTFILE 语句把表数据导出到一个文本文件中进行备份,并可使用 LOAD DATA...INFLLE 语句来恢复先前备份的数据。这种方法有一点不足,就是只能导出或导入数据的内容,而不包括表的结构,若表的结构文件损坏,则必须先设法恢复原来表的结构。

SELECT INTO... OUTFILE 语句

导出备份语句 SELECT INTO...OUTFILE 的语法格式为:

sql 复制代码
SELECT INTO OUTFILE 'file_ name' [ CHARACTER SET charset_name ] export_options | INTO DUMPFILE 'file name'

其中,export_options 的格式为:

sql 复制代码
[FIELDS
	[TERMINATED BY 'string']
	[[OPTIONALLY] ENCLOSED BY 'char']
	[ESCAPED BY 'char']
]
[LINES TERMINATED BY 'string']

语法说明如下:

  • 这条语句的作用是将表中 SELECT 语句选中的所有数据行写入到一个文件中。 file_ name 指定数据备份文件的名称。文件默认在服务器主机上创建。并且文件名不能是已己经存在的,否则可能会将原文件覆盖。如果要将该文件写入到一个特定的位置,则要在文件名前加上具体的路径。在文件中,导出的数据行会以一定的形式存放,其中空值是用"\N"表示 。
  • 导出语句中使用关键字 OUTFILE 时,可以在 export_options 中加入以下两条自选的子句,它们的作用是决定数据行在备份文件中存放的格式:
    ①FIELDS 子句:在 FIELDS 子句中有三条亚子句,分别是 TERMINATED BY、OPTIONALLY ENCLOSED BY 和 ESCAPED BY。 如果指定了 FIELDS 子句,则这三条亚子句中至少要求指定一 条。其中,TERMINATED BY 用来指定字段值之间的符号;ENCLOSED BY 子句用来指定包裹文件中字符值的符号,若加上关键字 OPTIONALLY 则表示所有的值都放在双引号之间;ESCAPED BY 子句用来指定转义字符。
    ②LINES 子句:在 LINES 子句中使用 TERMINATED BY 指定一个数据行结束的标志。
    如果 FIELDS 和 LINES子句都不指定,则默认声明的是下面的子句:
sql 复制代码
FIELDS TERMINATED BY '\t' ENCLOSED By " ESCAPED BY '\\' 
LINES TERMINATED BY '\n'
  • 导出语句中使用的是关键字 DUMPFILE 而非 OUTFILE 时,导出的备份文件里面所有的数据行都会彼此紧挨着放置,即值和行之间没有任何标记。

SELECT INTO... OUTFILE 语句可以导出txt、exce格式文件

LOAD DATA...INFILE 语句

LOAD DATA命令用于将本地文件系统中的数据导入到MySQL服务器的表中。通常,该命令用于快速将大量数据加载到数据库中。

导入恢复语句 LOAD DATA...INFILE 的语法格式为:

sql 复制代码
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'fle_name.txt' 
	[REPLACE | IGNORE]
	INTO TABLE tbl_name
	[ FIELDS
	[ TERMINATED BY 'string'] 
	[ [OPTIONALLY] ENCLOSED BY 'char'] 
	[ ESCAPED BY 'char' ] 
]
[LINES
	[ STARTING BY 'string' ] 
	[ TERMINATED BY 'string' ]
]
[IGNORE number LINES]
[(col_name_or_user_var,...)] 
[SET col_name = expr,...]]

语法说明如下:

  • LOW_PRIORITY | CONCURRENT:若指定 LOW_PRIORITY,则延迟该语句的执行;若指定 CONCURRENT,则当 LOAD DATA 正在执行的时候其他线程可以同时使用该表的数据。
  • LOCAL:若指定了 LOCAL,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。若设有指定 LOCAL,则文件必须位于服务器主机上,并且被服务器直接读取。与让服务器直接读取文件相比,使用 LOCAL 的速度会略慢些,这是由于文件的内容必须通过客户端发送到服务器上。
  • file_name:待导入的数据库备份文件名,文件中保存了待载入数据库的所有数据行。输入文件可以手动创建,也可以使用其他的程序创建。导入文件时可以指定文件的绝对路径,则服务器会根据该路径搜索文件。若不指定路径,则服务器在默认数据库的数据库目录中读取。 出于安全考虑,当读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。
  • REPLACE I IGNORE:如果指定 REPLACE,则当导入文件中出现与数据库中原有行的唯一关键字值时,输入行会替换原有行;如果指定 IGNORE,则把与原有行有相同的唯一关键字值的输入行跳过。
  • tbl_name:指定需要导入数据的表,该表在数据库中必须存在,表结构必须与导入文件的数据行一致。
  • FIELDS 子句:此处的 FIELDS 子句和 SELECT...INTO OUTFILE 语句中类似,用于判断字段之间和数据行之间的符号。
  • LINES 子句:TERMINATED BY 亚子句用来指定一行结束的标志;STARTING BY 亚子句则指定一个前缀,导入数据行时,忽略数据行中的该前缀和前缀之前的内容。如果某行不包括该前缀,则整个数据行被跳过。
  • IGNORE number LINES:这个选项可以用于忽略文件的前几行。
  • col_name_or_user_var:如果需要载入一张表的部分列,或者文件中字段值顺序与原表中列的顺序不同时,就必须指定一个列清单,其中可以包含列名或用户变量。
  • SET 子句:SET子句可以在导入数据时修改表中列的值。

在导入数据时需要特别注意。必须根据数据备份文件中数据行的格式来指定判断的符号。 例如,在 backupfile.txt 文件中字段值是以逗号隔开的,导入数据时就一定要使用 "TERMINATED BY" 子句指定逗号为字段值之间的分隔符,即与 SELECT...INTO OUTFILE 语句相对应。

另外需要注意的是,在多位用户同时使用 MySQL 数据库的情况下,为了得到一个一致的备份,需要在指定的表上使用 LOCK TABLES table_name READ 语句做一个读锁定,以防止在备份过程中表被其他用户更新;而当恢复数据时,则需要使用 LOCK TABLES table_name WRITE 语句做一个写锁定。以避免发生数据冲突。在数据库备份或恢复完毕之后需要使用 UNLOCK TABLES 语句对该表进行解锁。

例1:

sql 复制代码
LOAD DATA INFILE 'backup.txt' INTO TABLE tb_reader1;

使用 MySQL 客户端实用程序备份和恢复数据

MySQL 提供了许多免费的客户端实用程序,存放于 MySQL 安装目录下的 bin 子目录中。这些客户端实用程序可以连接到 MySQL 服务器进行数据库的访问,或者对 MySQL 执行不同的管理任务。 其中,mysqldump 程序和 mysqlimport 程序就分别是两个常用的用于实现 MySQL 数据库备份和恢复的实用工具。

使用 MySQL 客户端实用程序的方法

打开计算机中的 DOS 终端,进入 MySQL 安装目录下的 bin 子目录,如 C:\Program Files MySQL\MySQL Server 5. 5\bin,,由此可在该界面光标闪烁处输人所需的 MySQL 客户端实用程序的命令。

使用 mysqldump 程序备份数据

可以使用客户端实用程序 mysqldump 来实现 MySQL 数据库的备份。它除了可以与前面使用SQL语句备份表数据一样导出备份的表数据文件之外,还可以在导出的文件中包含数据库中表结构的 SQL 语句。 因此,mysqldump 程序可以备份数据库表的结构,还可以备份一个数据库,甚至整个数据库系统。只需在 MySQL 客户端实用程序的运行界面中输入 mysqldump--help 命令即可查看到 mysqldump 程序分别对应如下三种命令:

sql 复制代码
Usage: mysqldump [OPTIONS] database [tables]
OR 	   mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] 
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help

(1) 备份表

使用的命令格式为:mysqldump [OPTIONS] database [tables] > filename

语法说明如下:

  • OPTIONS:mysqldump 命令支持的选项,可以通过执行 mysqldump --help 命令得到 mysql dump 选项表及更多帮助信息。
  • database:指定数据库的名称,其后面可以加上需要备份的表名。若在命令中没有指定表名,则该命令会备份整个数据库。
  • filename:指定最终备份的文件名,如果该命令语句中指定了需要备份的多张表,那么备份后都会保存在这个文件中。文件默认的保存地址是 MySQL 安裝目录下的 bin 目录中。如果需要保存在特定位置,可以指定其具体路径。需要注意的是,文件名在目录中不能已经存在,否则新的备份文件会将原文件覆盖。

与其他的 MySQL 客户端实用程序一样,使用 mysqldump 备份数据时,需要使用一个用户账号连接到 MySQL 服务器,这可以通过用户手工提供参数或在选项文件中修改有关值的方式来实现。使用参数的格式是:-h[ hostname] -u[ username] -p[ password]。其中,-h 选项后面是主机名,如果是本地服务器,-h 选项可以省略;-u选项后面是用户名;-p 选项后面是用户密码,-p 选项和密码之间不能有空格。

(2) 备份数据库

mysqldump 程序还可以将一个或多个数据库备份到一个文件中,其使用的命令格式为:mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] > filename

(3)备份整个数据库系统

mysqldump 程序还能够备份整个数据库系统,即系统中的所有数据库,其使用的命令格式为:mysqldump [OPTIONS]--all-databases [OPTIONS] > filename

需要注意的是,尽管使用 mysqldump 程序可以有效地导出表的结构,但在恢复数据的时候,倘若所需恢复的数据量很大,备份文件中众多的 SQL 语句会使恢复的效率降低。因此,可以在 mysqldump 命令中使用"--tab="选项来分开数据和创建表的 SQL 语句。"--tab="选项会在选项中"="后面指定的目录里分别创建存储数据内容的.txt 格式文件和包含创建表结构的 SQL 句的 .sql 格式文件。另外,该选项不能与--databases 选项或--all-databases 选项同时使用,并且 mysqldump 必须运行在服务器主机上。

mysqldump的备份文件包含了创建数据库、数据表,以及插入数据表里原有数据的SQL语句,我们可以直接运行这些SQL语句来进行数据恢复。

使用 mysql 命令恢复数据

可以通过使用 mysql 命令将 mysqldump 程序备份的文件中全部的 SQL 语句还原到 MySQL 服务器中,从而恢复一个损坏的数据库。

如果是数据库中表的结构发生了损坏,也可以使用 mysql 命令对其单独做恢复处理,但是表中原有数据会全部被清空。

在 MySQL 中,使用 mysql 命令进行数据恢复(即执行 SQL 脚本文件)的标准语法格式如下:mysql -u 用户名 -p 数据库名 < 备份文件.sql

语法说明如下:

  • -u 用户名:指定登录 MySQL 的用户名(如 root)
  • -p:表示需要输入密码(若密码为空可省略)
  • 数据库名:指定要恢复数据的目标数据库(如果 SQL 文件中已包含 USE db_name;,则可省略)
  • < 重定向符号,将文件内容作为标准输入传递给 mysql 命令
  • 备份文件.sql:包含 SQL 语句的备份文件路径

注意:mysql 命令执行恢复时,要求文件内容必须是 SQL 语句(即以分号 ; 结尾的合法 SQL 命令,如 CREATE TABLE、INSERT INTO、UPDATE 等)。

如果内容是纯数据(.csv / .txt),不是 SQL 语句,mysql 会报语法错误。

使用 mysqlimport 程序恢复数据

倘若只是为了恢复数据表中的数据,可以使用 mysqlimport 客户端实用程序来完成。 这个程序提供了 LOAD DATA...INFILD 语句的 一个命令行接口,它发送 一个 LOAD DATA INFILE 命令到服务器来运作,其大多数选项直接对应 LOAD DATA...INFILE 语句。

运行 mysqlimport 程序对应的命令格式为:mysqlimport [OPTIONS] database textfile...

语法说明如下:

  • OPTIONS:mysqlimport 命令支持的选项,可以通过执行 mysqlimport --help 命令查看这些选项的内容和作用。常用的选项有:
    ①-d、-delete:在导入文本文件之前清空表中所有的数据行。
    ②-l、--lock-tables:在处理任何文本文件之前锁定所有的表,以保证所有的表在服务器同步,但对于 InnoDB 类型的表则不必进行锁定。
    ③--low-priority、--local、--replace、--ignore:分别对应 LOAD DATA...INFILE 语句中的 LOW_PRIORITY、LOCAL、REPLACE 和 IGNORE 关键字。
  • database:指定欲恢复的数据库名称。
  • textfile:存储备份数据的文本文件名。使用 mysqlimport 命令恢复数据时,mysqlimport 会剥去这个文件名的扩展名,并使用它来决定向数据库中哪张表导入文件的内容。另外,在该命令中需要指定备份文件的具体路径,若没有指定,则选取文件的默认位置,即 MySQL 安装目录的 DATA 目录下。
  • 与mysqldump 程序一样,使用 mysqlimport 恢复数据时,也需要提供-h、-u、-p 选项来连接 MySQL 服务器。

使用 MySQL 图形界面工具备份和恢复数据

用户可以使用常用的 MySQL 图形界面工具来进行 MySQL 数据库的备份与恢复操作。这种方式相对于使用 SQL 语句或 MySQL 客户端实用程序而言会简单些。

备份数据库

首先,以 Web 的方式登录 phpMyAdmin。 在管理界面中,有一个"导出"选项,用于指定备份数据库的操作功能,同时还有一个格式选择下拉框,用于选择备份文件的文件格式。在界面的左边,可以对欲备份的数据库和表进行选定。

恢复数据库

单击选取 phpMyAdmin 管理界面中的"Import" 选择卡,并输入欲导入的备份文件名,单击"执行"按钮,即可开展数据库的恢复操作。

phpMyAdmin图形界面工具可以将数据库中数据导出为多种格式,包括:CSV、EXCEL、DOC、SQL等。

直接复制

由于 MySQL 的数据库和表是直接通过目录和表文件来实现的,因此可以通过直接复制文件的方法来备份数据库。其具体过程是:

(1) 首先,在复制之前确保数据表当前状态下没有被使用,最好是暂时关闭 MySQL 服务器。

(2) 然后,复制待备份数据库所对应的文件目录下所有的表文件。 其中,如果表使用的是 MyISAM 格式,则复制 table_name.frm(表的描述文件)、table_name.MYD(表的数据文件)和 table_name.MYI(表的索引文件)三类文件;如果表使用的是 ISAM 格式,则复制 table_name. frm (表的描述文件)、table_name.ISD(表的数据文件) 和 table_name.ISM(表的索引文件)三类文件。

(3) 最后,重启服务器。

文件复制好之后,就可以将该文件复制到另外一个 MySQL 服务器的数据库目录下,此时该 MySQL 服务器就可以正常使用这个直接复制过来的数据库了。另外,还可以在数据库遭遇损坏时,将该文件直接覆盖到当前 MySQL 服务器的数据库目录下,实现数据库的恢复。

使用这种直接从一台 MySQL 服务器复制文件到另一台服务器的方法,需要特别注意以下两点:

  • 两台服务器必须使用相同或兼容的 MySQL 版本。
  • 两台服务器的硬件结构相同或相似,除非要复制的表使用 MyISAM 存储格式,这是因为这种表为在不同的硬件体系中共享数据提供了保证。

二进制日志文件的使用

在 MySQL 的实际操作中,数据库管理员及用户不可能无时无刻地都在备份数据。因此,数据遭遇丟失或被损坏时,只能恢复已经备份的文件,而在这之后更新的数据就无法恢复了。遇到这种情形时,可以考虑使用更新日志,这是因为更新日志可以实时记录数据库中修改、插入和删除的 SQL 语句。

在 MySQL 5.5 中,更新日志已经被二进制日志取代。二进制日志以一种更加有效的格式,并且是事务安全的方式,包含了更新日志中可用的所有信息,如关于每条更新数据库的语句的执行时间信息,而不包含没有修改任何数据的语句。这些语句以"事件"的形式保存,记录了数据的更改。

由于二进制日志包含了数据备份后进行的所有更新,因此二进制日志的主要目的就是在数据恢复时能够最大可能地更新数据库。

开启日志文件

运行 MySQL 服务器时若启用二进制日志,系统的性能会有所降低,而且会浪费一定的存储空间,因而 MySQL 默认是不开启二进制日志功能的,需要手工来启用。具体操作如下:

(1)打开 MySQL 安装目录下的 myini 文件( 若是 Linux 系统,则打开 my.cnf文件)。

(2)找到mysqld这个标签,在此标签下面,添加以下格式的一行语句: log-bin[=filename]

其中,log-bin 说明要开启二进制日志文件,可选项 flename 则是二进制日志文件的名字。加入该选项后,服务器启动时就会加载该选项,从而启用二进制日志。如果 filename 包含有扩展名,则扩展名将被忽略。MySQL 服务器会为每个二进制日志文件名后面自动添加一个数字编号扩展名,每次启动服务器或刷新日志时都会重新生成一个二进制日志文件,其扩展名中的数学编号依次递增。如果 filename 未给出,则默认为主机名。

(3) 保存修改,重启 MySQL 服务器。此时,在 MySQL 安装目录的 DATA 文件夹下就可以看到这样两个格式的文件:filename.数字编号、filename. index。 其中"filename. 数字编号"是二进制日志文件、它以二进制形式存储,用于保存数据库更新信息,当这个日志文件的大小达到最大时,MySQL 会自动创建一个新的二进制文件。"flename. index"是服务器自动创建的二进制日志索引文件。包含所有使用的二进制日志文件的文件名。

使用 mysqlbinlog 实用工具处理日志

MySQL 服务器开启二进制日志后,系统自动生成的二进制日志文件可以通过实用工具 mysqlbinlog 来处理。

  1. 查看二进制日志文件
    可以使用 mysqlbinlog 查看二进制日志文件,其命令格式为:mysqlbinlog [options] log_files...
    其中,log_files 是二进制日志的文件名。
  2. 使用二进制日志恢复数据
    可以使用 mysqlbinlog 恢复数据,其命令格式为:mysqlbinlog [options] log_files... | mysql [options]
    由于二进制日志文件会占用很大的硬盘资源,所以需要及时清除没用的二进制日志文件。 可以使用下面这条 SQL 语句清除所有的日志文件:RESET MASTER;
    倘若需要删除部分日志文件,则可以使用 PURCE MASTER LOCS 语句来实现,其语法格式为:
sql 复制代码
PURCE {MASTER | BINARY} LOGS TO 'log_name'
或 
PURCE {MASTER | BINARY} LOGS BEFORE 'date' 

语法说明如下:

第一条语句用于删除指定的日志文件,其中 log_name 为文件名。第二条语句用于刪除时间 date 之前的所有日志文件。

备份 恢复
SELECT INTO...OUTFILE(表数据)
mysqldump(表数据+表结构)
LOAD DATA...INFILE
mysql
mysqlimport
二进制日志(binlog)
phpMyAdmin(表数据+表结构)
直接复制(表数据+表结构)

用户账号及相关信息都存储在名为mysql的数据库中。

MySQL中的用户账号信息存储在mysql数据库的user表。

MySQL成功安装后,系统会创建一个存放数据库文件的目录,该目录名是data。

MySQL安装完成后,默认有三个数据库,mysql数据库存储了MySQL服务器正常运行所需的各种信息,information_schema数据库提供了访问MySQL数据库元数据的各种视图,performance_schema数据库为MySQL服务器的运行时状态提供了一个底层的监控功能。

要使用RENAMEUSER语句,用户必须拥有全局CREATEUSER权限或某个数据库的UPDATE权限,该数据库是mysql。

MySQL系统表user中存储的是所有用户的授权信息。

安装MySQL后,默认自动安装的数据库有:mysql、performance_schema, test、world、information_schema

相关推荐
ltl2 小时前
RocksDB Leveled Compaction:层级不变式与 CompactionPicker
数据库
ltl2 小时前
DuckDB 向量化与 Morsel-Driven Pipeline
数据库
NJCloud2 小时前
TiDB 集群部署与 MySQL 兼容性适配实战
linux·运维·数据库·mysql·tidb
喜欢打篮球的普通人2 小时前
LLVM Backend Lowering 从入门到实战:把 IR 变成机器码的完整链路
android·java·数据库
SomeOtherTime4 小时前
Postgresql触发器实现对表的日志审计
数据库·postgresql
这个DBA有点耶5 小时前
Oracle 迁移金仓兼容性评估指南:5 大维度深度拆解
数据库·oracle·架构
李可以量化6 小时前
Redis 从了解到精通(二)下:发布订阅进阶命令、量化场景落地与避坑指南
数据库·redis·python·qmt·ptrade
添砖java‘’6 小时前
Redis中常用数据结构
数据库·redis·缓存