不同类型的数据库备份,所能应付的情况是不一样的,而且,数据库的备份同时也还具有其他很多的作用。相信每个人对数据库备份作用的理解都会有差别。下面就列举我个人理解的要用到数据库备份的常见情况:
一、数据丢失应用场景
- 人为操作失误造成某些数据被误操作。
- 软件BUG造成数据部分或全部丢失。
- 硬件故障造成数据库数据部分或全部丢失。
- 因安全漏洞,入侵者将数据恶意破坏。
二、非数据丢失应用场景
- 特殊应用场景下基于时间点的数据恢复。
- 开发测试环境数据库搭建。
- 相同数据库的新环境搭建。
- 数据库或数据迁移。
上面所列出的只是一些常见的应用场景,除了这几种场景,数据库备份还会有很多其他应用场景。
没有哪一种数据库备份能够解决以上列举的所有场景,即使仅只是数据丢失的各种场景都无法通过某一种数据库备份完美解决,当然就更不用说能够解决所有备份的应用场景了。比如:
-
当我们遇到磁盘故障,丢失了整个数据库的所有数据,并且无法从已经出现故障的硬盘上面恢复出来的时候,就可能必须通过一个实时或有短暂时间差的复制备份数据库来进行恢复。当然如果没有这样的一个数据库,就必须有最近时间点的整个数据库的物理或逻辑备份数据,并且有该备份之后的所有物理或逻辑增量备份,以期望尽可能的将数据恢复到出现故障之前最近的时间点。
-
而当我们遇到操作失误造成数据被误操作时,就要有一个能恢复到错误操作时间点之前的数据备份,当然这个备份可能是整改数据库的备份,也可以仅仅是被误操作的表的备份。
-
而当我们要做跨平台的数据库迁移时,则需要一个逻辑的数据库备份,因为平台的差异可能使物理备份的文件格式在两个平台上无法兼容。
既然没有哪一种数据库备份能够完美的解决所有应用场景的需要,而每个数据库环境要面对的数据库备份应用场景又可能各不一样,也许只是须要面对很多种场景中的某种或几种,那么就非常有必要指定一个合适的备份方案和备份策略,通过最简单的技术和最低廉的成本来满足我们的需求。
冷备份与恢复
一、 逻辑备份
数据库逻辑备份就是备份软件按照最初设计的逻辑关系,以数据库的逻辑结构对象为单位,将数据库中的数据按照预定义的逻辑关联格式一条一条生成相关的文本文件,以达到备份的目的。
逻辑备份可以说是最简单,也是目前中小型系统最常使用的备份方式。在 MySQL 中常用的:
- mysqldump
- mydumper
创建一个数据库
mysql_php
;
在从服务上通过连接主服务器上的数据库,通过 mysqldump 备份数据到从数据库中
在主服务器上,设置读锁定有效,这个操作为了确保没有数据库操作,以便获得一致性的快照。
然后在从服务器上进行数据的备份,并同步导入备份数据
创建一个库,最好苦命和你需要导进的库名一致;然后再进行导入数据库
在数据备份完成之后,就可以恢复主数据库的写操作了,即是把锁给去掉
二、物理备份
停止主库与从库,然后复制主库中的data目录到从库中。
三、使用 mydumper
mydumper 是一个针对 MySQL 和 drizzle 的高性能多线程的备份和恢复工具。此工具的开发人员分别来自 MySQL、facebook、skysql公司;目前已经有一些大型产品业务员测试并使用了该工具。我们在恢复数据库时也可使用 myloader 工具。Mydumper 的主要特性包括:
- 采用轻量级C语言写的代码。
- 相比于 mysqldump,其速度快了近10倍。
- 具有事务性和非事务性表一致的快照(适用于0.2.2+)。
- 可快速进行文件压缩(File compression on-the-fly)。
- 支持导出binlog。
- 可多线程恢复(适用于0.2.1+)。
- 可以用守护进程的工作方式,定时扫描和输出连续的二进制日志
安装命令如下所示:
[root@localhost src]# yum -y install glib2-devel zlib-devel pcre-devel cmake gcc-c++
[root@localhost src]# yum -y install git
[root@localhost src]# yum -y install https://github.com/maxbube/mydumper/releases/download/v0.10.5/mydumper-0.10.5-1.el7.x86_64.rpm
[root@localhost src]# mydumper -V
#出现 mydumper 0.10.5, built against MySQL 5.7.33-36 就代表安装好了
如果上面的 mydumper 下载不了,请看这个文章:
https://blog.csdn.net/qq_39408664/article/details/119378745
Mydumper 中的主要参数如下
-host, -h
:连接的MySQL服务器。-user,-u
:用户备份的连接用户。-password,-p
:用户的密码。-port,-P
:连接端口。-socket,-S
:连接socket文 件。-database,-B
:需要备份的数据库。-table-list,-T
:需要备份的表,用逗号(,)分隔。-outputdir,-o
:输出的目录。-build-empty-files,-e
:默 认无数据则只有表结构文件。-regex,-x
:支持正则表达式,如mydumper-regex’(2l(mysqltest)’。-ignore-engines,-i
:忽略的存储引擎。-no- schemas,-m
:不导出表结构。-long-query-guard
:长查询,默认60s。-kill-long-queries,-k
:可以设置kill长查询。-verbose,-v
:0=silent,1=errors, 2=warmings,3=info,默认是2。-binlogs,-b
:导出binlog。-daemon,-D
:启用守护进程模式。-snapshot-interval,-I
:dump快照间隔时间,默认60s。-logfile,-L
:mysaqldumper的目志输出,一般在Daemon模式下使用。
我们来看一下这个数据库里面的数据量是多少
mydumper mysqldump 备份数据对比
对比 mysql 与 myloader 数据还原:
热备份与恢复
xtrabackup手册:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
热备份的方式也是直接复制数据物理文件,和冷备份应用,但热备份可以不停机直接复制,一般用于7x24小时不间断的重要核心业务。MySQL 社区版的热备份工具 InnoDB Hot Backup的一个很好的替代品。下面具体介绍一下这个软件的使用方法。xtrabackup 是 Percona 公司的开源项目,用以实现类似 InnoDB 官方的热备份工具 InnoDB Hot Backup 的功能,它能非常快速的备份与恢复MySQL数据库。
下面来看看xtrabackup的安装方法,安装命令如下:
先去下载 xtrabackup:https://blog.csdn.net/qq_39408664/article/details/119378653
然后上传到 Linux 里面,进入上传的目录
[root@localhost file]$ yum localinstall percona-xtrabackup-80-8.0.14-1.el7.x86_64.rpm
[root@localhost file]# xtrabackup
中主要包含两个工具:
xtrabackup
:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex
:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host
指定主机
--user
指定用户名
--password
指定密码
--port
指定端口
--databases
指定数据库
--incremental
创建增量备份
--incremental-basedir
指定包含完全备份的目录
--incremental-dir
指定包含增量备份的目录
--apply-log
对备份进行预处理操作 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。 因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only
不回滚未提交事务
--copy-back
恢复备份目录
开始进行备份操作,进入主库中:
# 这里可能出现错误,错误在下面已经解释了;如果没有错误,安装流程执行即可
[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --password=root --port=3306 --backup --target-dir=/home/master_slave
[root@localhost ~]# ll /home/master_slave
总用量 298032
-rw-r-----. 1 root root 476 8月 4 15:52 backup-my.cnf
-rw-r-----. 1 root root 3877 8月 4 15:52 ib_buffer_pool
-rw-r-----. 1 root root 79691776 8月 4 15:51 ibdata1
drwxr-x---. 2 root root 143 8月 4 15:52 mysql
-rw-r-----. 1 root root 156 8月 4 15:52 mysql-bin.000012
-rw-r-----. 1 root root 19 8月 4 15:52 mysql-bin.index
drwxr-x---. 2 root root 26 8月 4 15:52 mysql_dump
-rw-r-----. 1 root root 25165824 8月 4 15:52 mysql.ibd
drwxr-x---. 2 root root 147 8月 4 15:52 mysql_php
drwxr-x---. 2 root root 8192 8月 4 15:52 performance_schema
drwxr-x---. 2 root root 28 8月 4 15:51 sys
-rw-r-----. 1 root root 188743680 8月 4 15:52 undo_001
-rw-r-----. 1 root root 11534336 8月 4 15:52 undo_002
-rw-r-----. 1 root root 21 8月 4 15:52 xtrabackup_binlog_info
-rw-r-----. 1 root root 99 8月 4 15:52 xtrabackup_checkpoints
-rw-r-----. 1 root root 526 8月 4 15:52 xtrabackup_info
-rw-r-----. 1 root root 2560 8月 4 15:52 xtrabackup_logfile
-rw-r-----. 1 root root 39 8月 4 15:52 xtrabackup_tablespaces
[root@localhost ~]# scp -r /home/master_slave/ root@192.168.183.181:/home/master_slaves
#scp Linux的传输功能
#-r /home/master_slave/ 主服务器的 master_slave 目录
#root@192.168.183.181 从库用户名@从库IP地址
#:/home/laravel-shop 从库存放的目录
注意:在主库执行备份的过程中出现这个错误,就是没有备份成功
这个问题的意思是,你当前使用的这个备份的账号没有备份的权限,怎么解决呢?看下面:
https://blog.csdn.net/qq_39408664/article/details/119385299
在这个链接里面的 新增MySQL用户 按照方法新增一个用户,或者看最后一个给予权限即可!
然后删掉之前备份的文件夹或者改个文件夹名称,再执行备份文件,出现下图一致即备份成功
然后进入从库中:
# 查看目录
[root@localhost ~]# ll /home/master_slaves
总用量 298032
-rw-r-----. 1 root root 476 8月 3 20:52 backup-my.cnf
-rw-r-----. 1 root root 3877 8月 3 20:52 ib_buffer_pool
-rw-r-----. 1 root root 79691776 8月 3 20:51 ibdata1
drwxr-x---. 2 root root 143 8月 3 20:52 mysql
-rw-r-----. 1 root root 156 8月 3 20:52 mysql-bin.000012
-rw-r-----. 1 root root 19 8月 3 20:52 mysql-bin.index
drwxr-x---. 2 root root 26 8月 3 20:51 mysql_dump
-rw-r-----. 1 root root 25165824 8月 3 20:51 mysql.ibd
drwxr-x---. 2 root root 147 8月 3 20:51 mysql_php
drwxr-x---. 2 root root 8192 8月 3 20:52 performance_schema
drwxr-x---. 2 root root 28 8月 3 20:51 sys
-rw-r-----. 1 root root 188743680 8月 3 20:52 undo_001
-rw-r-----. 1 root root 11534336 8月 3 20:51 undo_002
-rw-r-----. 1 root root 21 8月 3 20:52 xtrabackup_binlog_info
-rw-r-----. 1 root root 99 8月 3 20:52 xtrabackup_checkpoints
-rw-r-----. 1 root root 526 8月 3 20:52 xtrabackup_info
-rw-r-----. 1 root root 2560 8月 3 20:51 xtrabackup_logfile
-rw-r-----. 1 root root 39 8月 3 20:52 xtrabackup_tablespaces
# 停止MySQL
[root@localhost ~]# service mysql stop
# Shutting down MySQL...... SUCCESS!
# 将 mysql 下的 data 目录改名
[root@localhost ~]# mv /usr/local/mysql/data /usr/local/mysql/data2
[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/home/master_slaves
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/data
[root@localhost ~]# service mysql start
# Starting MySQL.Logging to '/usr/local/mysql/data/data.err'.
# ..... SUCCESS!
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mysql_dump |
| mysql_php |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
到这里就备份好了。
备份注意一点的问题:(OS errno 2 - No such file or directory)找不到目录
原因是 :xtrabackup --defaults-file=/etc/my.cnf --copy-back --targetdir=/home/master_slaves/ --target-dir 之间少了个横杆。
对于热备份实现解释:
- innobackupex 启动后,会先 fork 一个进程,用于启动 xtrabackup ,然后等待 xtrabackup 备份 ibd 数据文件。
- xtrabackup 在备份 innoDB 数据时,有两种线程:redo 拷贝线程和 ibd 数据拷贝线程;xtrabackup 进程开始执行后,会启动一个 redo 拷贝的线程,用于从最新的 checkpoint 点开始顺序拷贝 redo.log;再启动 ibd 数据拷贝线程,进行拷贝 ibd 数据。这里是先启动 redo 拷贝线程的;在此阶段,innobackupex 处于等待状态(等待文件被创建)。
- xtrabackup 拷贝完成 ibd 数据文件后,会通知 innobackupex (通过创建文件),同时 xtrabackup 进入等待状态(redo线程依旧在拷贝redo.log)。
- innobackupex 收到 xtrabackup 通知后,执行 FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,然后开始备份非 InnoDB 文件(如:frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非 InnoDB 文件的过程当中,数据库处于全局只读状态。
- 当 innobackupex 拷贝完所有的非 InnoDB 文件后,会通知 xtrabackup ,通知完成后,进入等待状态。
- xtrabackup 收到 innobackupex 备份完成的通知后,会停止 redo 拷贝线程,然后通知 innobackupex ,redo.log 文件拷贝完成。
- innobackupex 收到 redo.log 备份完成后,就进行解锁操作,执行:UNLOCK TABLES。
- 最后 innobackupex 和 xtrabackup 进程各自释放资源,写备份元数据信息等,innobackupex 等 xtrabackup 子进程结束后退出。