开发者学堂课程【MySQL 实操课程:MySQL 下全量和增量备份与还原原理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/717/detail/12825
MySQL 下全量和增量备份与还原原理
内容介绍
一、完全备份与备份方式
二、案例演示
一、完全备份与备份方式
1、完全备份
(1)完全备份最简单也最快速的方法是拷贝数据库文件夹 ,当然在拷贝时对MySQL 会有些要求,一般在进行拷贝时是希望没有新数据的型的,这是他的一个要求,所以要进行使用表的操作。
(2)也可以使用 mysqldump 程序或 mysqlhotcopy 脚本对数据库进行 SQL 语句级别的备份, 与前面一种备份方式不同,前面的备份方式是备份实际存放的物理文件,而第二种相对于是一种导出的操作,就是将 MySQL 中的数据导出成sql脚本,然后再重新执行 sql 脚本,从而实现还原,是属于一种逻辑的备份,缺点就是它们速度要稍微慢一些,因为不只是文件的复制,还要将应用 sql 本身的处理能力导出sql,不过通用性更强,因为是基于 sql 语句,可以在不同的 MySQL 版本上执行,而且可以分析 sql 语句,更加清楚的理解 sql 语句,从而进行选择性的还原。
2、使用拷贝文件夹的方式备份
(1)因为My SQL 表保存为文件方式,所以理论上来说可以通过拷贝文件的方式对数据库进行备份。不过,使用直接备份方法时,必须要保证表在拷贝期间不被使用。如果不能满足这一条件,拷贝的文件就可能存在数据的不一致性,拷贝操作也就失败了。就是在进行拷贝时不能让 MySQL 数据库再进行写入数据,因为会导致备份拷贝出的文件与最终数据形成偏差,出现不一致的情况,所以在备份之前要将数据库进行锁表的操作,为可读不可写。
(2)最可靠的方法是在拷贝以前关闭 MySQL 服务,拷贝完成后再重新启动服务。但有些应用会要求24小时不间断服务,此时关闭服务器的方法就不很合适,不过MySQL 提供了表的锁定和解锁的相关操作,以确保在拷贝文件期间该文件不会被修改。
二、案例演示
下面进行文件夹备份案例演示:
1、备份
首先连接到服务器:
[root@iZwz9bize6nk8hug8jOvywZ
~
]# ssh root@47.112.159.55
进入 MySQL:
[root@iZwz9bize6nk8hug8jOvywZ
~
]# /usr/ loca
l
/ mysq1/bin/mysq
l
-uroot -
p
Enter password:
在 aliyun 下面有测试表 school,打开 school 可以看到有三条事例:
mysql
> select * from school;
|
id | name |
|
1001 | yizhong |
|
1002 |
er
zhong |
|
1003 |
san
zhong |
然后切换到 aliyun 数据库:
[root@iZwz9bize6nk8hug8jOvywZ
mysql
]#
cd
aliyun
[root@iZwz9bize6nk8hug8jOvywZ
aliyun
]#
ll
…
-rw-r----- 1 mysql mysql
8586 Aug 20 16:17 school.frm
-rw-r----- 1 mysql mysql
114688 Aug 20 22:53 school.ibd
…
可以看到 school.frm,school.ibd 文件,一个是表结构文件,一个是数据文件,这种文件属于 InnoDB create table school 文件的存储引擎,可以通过 mysql> show create table school; 进行查看。
在当前目录进行备份文件,先创建 school 文件夹,然后拷贝 school 文件到 school 文件夹:
[root@iZwz9bize6nk8hug8jOvywZ
aliyun
]# mkdir school
[root@iZwz9bize6nk8hug8jOvywZ
aliyun
]#
cp
-r school.* school/
[root@iZwz9bize6nk8hug8jOvywZ
aliyun
]# cd school
[root@iZwz9bize6nk8hug8jOvywZ school]# ll
t
otal 108
-rw-r----- 1 mysql mysql
8586 Aug 20 16:17 school.frm
-rw-r----- 1 mysql mysql
114688 Aug 20 22:53 school.ibd
说明拷贝成功。
2、还原
然后删除 school 的两条数据和切换到 aliyun 删除 school 的两个文件:
mysql
>
delete
from
school
;
mysql
>
select
*
from
school
;
Empty
set
(0.00 sec)
[root@iZwz9bize6nk8hug8jOvywZ //]# cd /data/mysql/aliyun
[root@iZwz9bize6nk8hug8jOvywZ aliyun]#
rm
-
rf
school
.*
[root@iZwz9bize6nk8hug8jOvywZ aliyun]# ll
此时看不到 school 的两个文件了,然后将这两个文件切换到上一级目录,拷贝到 /data/mysql/aliyun 目录:
[root@iZwz9bize6nk8hug8jOvywZ school]#
cp
-
r
* ./
[root@iZwz9bize6nk8hug8jOvywZ school]#
cp
-
r
*
/data
/mysql/aliyun
[root@iZwz9bize6nk8hug8jOvywZ school]# cd ..
[root@iZwz9bize6nk8hug8jOvywZ aliyun]# ll
…
-rw-r----- 1 root root
8586 Aug 20 16:17 school.frm
-rw-r----- 1 root root
114688 Aug 20 22:53 school.ibd
…
此时进行查看可以发现两个文件又出现了,说明还原操作成功,但因为是通过 root进行操作的,所以所有者由 mysql 变为了 root,所以需要修改所以权:
[root@iZwz9bize6nk8hug8jOvywZ aliyun]#
chgrp
-R
mysql
/data/mysql/ && chown -R mysql /data/mysql/
[root@iZwz9bize6nk8hug8jOvywZ aliyun]# ll
…
-rw-r----- 1 mysql mysql
8586 Aug 20 16:17 school.frm
-rw-r----- 1 mysql mysql
114688 Aug 20 22:53 school.ibd
…
此时所有权为 mysql,说明修改成功。再去查询 school 表中的记录会发现查不到:
mysql
>
select
*
from
school
;
Empty
set
(0.00 sec)
mysql> exit
因为这里涉及 mysql 的重启操作:
[root@iZwz9bize6nk8hug8jOvywZ
~
]# /usr/local/mysql/bin/mysqladmin shutdown -uroot -p
[root@iZwz9bize6nk8hug8jOvywZ
~
]# /usr/local/mysql/bin/mysqld_safe /etc/my.cnf&
[root@iZwz9bize6nk8hug8jOvywZ
~
]# sed: -e expression
#1,char
10:
unknown option to ‘s’
[root@iZwz9bize6nk8hug8jOvywZ
~
]# /usr/local/mysql/bin/mysql -uroot -p
然后再进行查询可以发现两条记录重新出现:
mysql> use aliyun
m
ysql> show tables;
m
ysql> select * from school;
|
id | name |
|
1001 | yizhong |
|
1002 |
er
zhong |
|
1003 |
san
zhong |
说明还原成功。所以可以通过这样的一种方式去还原操作,就是完成物理文件的备份,这里是手动的进行拷贝,也可以去做定时的备份,比如说通过 shell 脚本。这里讲解的是使用拷贝文件夹的方式进行备份还原,通过物理方式备份,后面的课程将讲解逻辑的备份。而在备份过程中,最好是关闭 MySQL 服务,但是在实际生产环境下不会这样做,所以可以选择业务不繁忙的情况下进行备份,前提是需要锁表。