就业类第 2 阶段 2401--3.21 天3 备份
一、逻辑备份
备份的是建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。
本质:导出的是SQL语句文件
优点:不论是什么存储引擎,都可以用mysqldump备成SQL语句
缺点:速度较慢,导入时可能会出现格式不兼容的突发情况,无法做增量备份和累计增量备份。
提供三种级别的备份,表级,库级和全库级
逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库,效率相对较低。
数据一致,服务可用。:如何保证数据一致,在备份的时候进行锁表会自动锁表。锁住之后在备份。
本身为客户端工具: 远程备份语法: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql 本地备份语法: # mysqldump -u用户名 -p密码 数据库名 > 备份文件.sql
1.常用备份选项
-A, --all-databases 备份所有库
-B, --databases bbs test mysql 备份多个数据库
--no-data,-d 不导出任何数据,只导出数据库表结构。
2.备份表
语法: # mysqldump -u root -p1 db1 t1 > /db1.t1.bak [root@mysql-server ~]# mkdir /home/back #创建备份目录 [root@mysql-server ~]# mysqldump -uroot -p'qf123' company employee5 > /home/back/company.employee5.bak mysqldump: [Warning] Using a password on the command line interface can be insecure. 备份多个表: 语法: mysqldump -u root -p1 db1 t1 t2 > /db1.t1_t2.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' company new_t1 new_t2 > /home/back/company.new_t1_t2.bak
3、备份库
备份一个库:相当于将这个库里面的所有表全部备份。 语法: # mysqldump -u root -p1 db1 > /db1.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' company > /home/back/company.bak 备份多个库(-B): 语法:mysqldump -u root -p1 -B db1 db2 db3 > /db123.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' -B company testdb > /home/back/company_testdb.bak 备份所有的库: 语法:# mysqldump -u root -p1 -A > /alldb.bak [root@mysql-server ~]# mysqldump -uroot -p'qf123' -A > /home/back/allbase.bak
到目录下面查看一下:
4、恢复数据库和表
为保证数据一致性,应在恢复数据之前停止数据库对外的服务,停止binlog日志 因为binlog使用binlog日志恢复数据时也会产生binlog日志。
为实验效果先将刚才备份的数据库和表删除了。登陆数据库:
[root@mysql-server ~]# mysql -uroot -pqf123
mysql> show databases;
mysql> drop database company; mysql> \q
5、恢复库
登陆mysql创建一个库 mysql> create database company; 恢复: [root@mysql-server ~]# mysql -uroot -p'qf123' company < /home/back/company.bak
6、恢复表
登陆到刚才恢复的库中将其中的一个表删除掉 mysql> show databases; mysql> use company mysql> show tables; +-------------------+ | Tables_in_company | +-------------------+ | employee5 | | new_t1 | | new_t2 | +-------------------+ mysql> drop table employee5; 开始恢复: mysql> set sql_log_bin=0; #停止binlog日志(可选) Query OK, 0 rows affected (0.00 sec) mysql> source /home/back/company.employee5.bak; -------加路径和备份的文件 恢复方式二: # mysql -u root -p1 db1 < db1.t1.bak 库名 备份的文件路径
7、备份及恢复表结构
1.备份表结构: 语法:mysqldump -uroot -p123456 -d databasename tablename > dump.sql [root@mysql-server ~]# mysqldump -uroot -p'qf123' -d company employee5 > /home/back/emp.bak 恢复表结构: 登陆数据库创建一个库 mysql> create database t1; 语法:# mysql -u root -p1 -D db1 < db1.t1.bak [root@mysql-server ~]# mysql -uroot -p'qf123' -D t1 < /home/back/emp.bak
登陆数据查看:
8、在库里数据的导入导出。没有表结构。
表的导出和导入只备份表内记录,不会备份表结构,需要通过mysqldump备份表结构,恢复时先恢复表结构,再导入数据。
mysql> show variables like "secure_file_priv"; ----查询导入导出的目录。(保证数据安全做共享)
修改安全文件目录: 1.创建一个目录:mkdir 路径目录 [root@mysql-server ~]# mkdir /sql 2.修改权限 [root@mysql-server ~]# chown mysql.mysql /sql 3.编辑配置文件: vim /etc/my.cnf 在[mysqld]里追加 secure_file_priv=/sql 4.重新启动mysql.
1.导出数据 登陆数据查看数据 mysql> show databases; #找到test库 mysql> use test #进入test库 mysql> show tables; #找到它t3表 mysql> select * from t3 into outfile '/sql/test.t3.bak'; 添加修饰的: mysql> select * from t3 into outfile '/sql/test.t3.bak1' fields terminated by ',' lines terminated by '\n'; 注: fields terminated by ',' :字段以逗号分割 lines terminated by '\n':结尾换行
2.数据的导入 先将原来表里面的数据清除掉,只保留表结构 mysql> delete from t3; mysql> load data infile '/sql/test.t3.bak' into table t3; 如果将数据导入别的表,需要创建这个表并创建相应的表结构。
二、Mysql bin-log日志恢复数据
需要开启binlog日志功能
加上配置之后重启服务,使其生效
[root@mysql-1 mysql]# systemctl restart mysqld
mysql> flush logs; #刷新binlog日志,使下面的语句存放到下一个binlog日志中 mysql> create table testdb.t2(id int);
根据位置恢复
找到要恢复的sql语句的起始位置、结束位置
[root@mysql-1 mysql]# mysqlbinlog mysql-bin.000002 --base64-output=decode-rows #查看binlog日志内容
mysql>drop table testdb.t2(id int); //删除表格。注意:增删改都会记录到binlog日志中。 [root@mysql-1 mysql]# mysqlbinlog --start-position 219 --stop-position 321 mysql-bin.000002 |mysql -uroot -p123 #恢复语句
作业:
根据binlog日志的时间点恢复
找到要恢复sql语句的起始时间、结束时间
mysqlbinlog --start-datetime='2019-8-21 23:55:54' --stop-datetime='2019-8-21 23:56:541' mylog.000001 | mysql -u root -p1
三、物理备份
percona是一家老牌的mysql技术咨询公司。它不仅提供mysql的技术支持、培训、咨询,还发布了mysql的分支版本--percona Server。并围绕percona Server还发布了一系列的mysql工具。
物理备份: 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
1.完全备份-----完整备份:
每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制,备份后会清除文件的存档属性,方便日后增量备份或者差异备份进行版本比较。
特点:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。
2.增量备份: 每次备份上一次备份到现在产生的新数据
在第一次完整备份之后,第二次开始每次都将添加了存档属性的文件进行备份,并且在备份之后再把这些存档属性清除。为什么要清除存档属性呢?这就是为了下一次备份的时候判断是否有文件变化,因为用户在每次备份以后修改这些被清除存档属性的文件,存档属性就会自动加上,相当于用户告诉系统,这些文件有变化,你下一次就备份这些文件,其他没有存档属性的就不需要备份,这就是增量备份的工作机制。
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢 复,恢复时间长。
-
差异备份:只备份跟完整备份不一样的 在第一次完整备份之后,第二次开始每次都将所有文件与第一次完整备份的文件做比较,把自第一次完整备份以来所有修改过的文件进行备份,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。因此,差异备份在备份完毕之后不需要清除文件的存档属性,因为这些文件和下一次备份没有什么关系,它仅仅和第一次完整备份的数据进行比较(第一次完整备份之后是清除存档属性的)。
(相当于第一次机器人把地板打扫干净了,你踩过,就会有脚印,机器人就把脚印记录下 来,但不打扫,下次你又有踩脏的,机器人就把你这几次所有踩脏的地方都记录下来,始终 不打扫,每次都这样。机器人每次记录的内容就相当于差异备份的内容)
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。
简单的讲,完整备份就是不管三七二十一,每次都把指定的备份目录完整的复制一遍,不管目录下的文件有没有变化;增量备份就是每次将之前(第一次、第二次、直到前一次)做过备份之后有变化的文件进行备份;差异备份就是每次都将第一次完整备份以来有变化的文件进行备份。
热备份
数据库启动同时给客户端提供服务的情况下
冷备份 数据库要关掉或者不能给客户端提供服务
官网:www.percona.com
1.安装xtrabackup
安装xtrabackup # wget http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm # rpm -ivh percona-release-0.1-4.noarch.rpm [root@mysql-server yum.repos.d]# vim percona-release.repo
修改如下内容:将原来的1改为0
[root@mysql-server yum.repos.d]# yum -y install percona-xtrabackup-24.x86_64
2.完全备份流程:
创建备份目录: [root@mysql-server ~]# mkdir /xtrabackup/full -p 备份: [root@mysql-server ~]# innobackupex --user=root --password='123' /xtrabackup/full
可以查看一下: [root@mysql-server ~]# cd /xtrabackup/full/ [root@mysql-server full]# ls 2019-08-20_11-47-49 ======================================================= 完全备份恢复流程 1. 停止数据库 systemctl stop mysqld&&systemctl stop firewalld&&setenforce 0 2. 清理环境 3. 重演回滚--> 恢复数据 4. 修改权限 5. 启动数据库 1.关闭数据库: [root@mysql-server ~]# systemctl stop mysqld [root@mysql-server ~]# rm -rf /var/lib/mysql/* [root@mysql-server ~]# rm -rf /var/log/mysqld.log #可选操作 [root@mysql-server ~]# rm -rf /var/log/mysql-slow/slow.log #可选操作 2.恢复之前的验证恢复: [root@mysql-server ~]# innobackupex --apply-log /xtrabackup/full/2019-08-20_11-47-49 3.确认数据库目录: 恢复之前需要确认配置文件内有数据库目录指定,不然xtrabackup不知道恢复到哪里 # cat /etc/my.cnf [mysqld] datadir=/var/lib/mysql 4.恢复数据: [root@mysql-server ~]# innobackupex --copy-back /xtrabackup/full/2019-08-20_11-47-49 5.修改权限: [root@mysql-server ~]# chown mysql.mysql /var/lib/mysql -R 启动数据库: [root@mysql-server ~]# systemctl start mysqld
3.增量备份流程
原理:每次备份上一次备份到现在产生的新数据
1.在数据库上面创建一个测试的库
1.完整备份:周一
[root@mysql-server ~]# rm -rf /xtrabackup/* [root@mysql-server ~]# innobackupex --user=root --password='123' /xtrabackup [root@mysql-server ~]# cd /xtrabackup/ [root@mysql-server xtrabackup]# ls 2019-08-20_14-51-35 [root@mysql-server xtrabackup]# cd 2019-08-20_14-51-35/ [root@mysql-server 2019-08-20_14-51-35]# ls backup-my.cnf ib_buffer_pool mysql sys testdb xtrabackup_info company ibdata1 performance_schema test xtrabackup_checkpoints xtrabackup_logfile
2、增量备份:周二 —— 周三
在数据库中插入周二的数据: mysql> insert into testdb.t1 values(2); #模拟周二 [root@mysql-server ~]# innobackupex --user=root --password='123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2019-08-20_14-51-35/ [root@mysql-server ~]# cd /xtrabackup/ [root@mysql-server xtrabackup]# ls 2019-08-20_14-51-35 2019-08-20_15-04-29 ---相当于周二的增量备份
在数据库中插入周三的数据: mysql> insert into testdb.t1 values(3); #模拟周三 [root@mysql-server ~]# innobackupex --user=root --password='123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2019-08-20_15-04-29/ #基于前一天的备份为目录 [root@mysql-server ~]# cd /xtrabackup/ [root@mysql-server xtrabackup]# ls 2019-08-20_14-51-35 2019-08-20_15-04-29 2019-08-20_15-10-56 ---相当于周三的增量备份
查看一下备份目录: [root@mysql-server ~]# ls /xtrabackup/ 2019-08-20_14-51-35 2019-08-20_15-04-29 2019-08-20_15-10-56 全备周一 增量周二 增量周三
增量备份恢复流程 1. 停止数据库 2. 清理环境 3. 依次重演回滚redo log--> 恢复数据 4. 修改权限 5. 启动数据库 6. binlog恢复
[root@mysql-server ~]# systemctl stop mysqld [root@mysql-server ~]# rm -rf /var/lib/mysql/* 依次重演回滚redo log: [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-08-20_14-51-35 周二 --- 周三 [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-08-20_14-51-35 --incremental-dir=/xtrabackup/2019-08-20_15-04-29 [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-08-20_14-51-35 --incremental-dir=/xtrabackup/2019-08-20_15-10-56/ 恢复数据: [root@mysql-server ~]# innobackupex --copy-back /xtrabackup/2019-08-20_14-51-35/ 修改权限 [root@mysql-server ~]# chown -R mysql.mysql /var/lib/mysql [root@mysql-server ~]# systemctl start mysqld 登陆上去看一下:b
4.差异备份流程
清理备份的环境:
[root@mysql-server ~]# rm -rf /xtrabackup/* 登陆数据库,准备环境 mysql> create database testdb; mysql> delete from testdb.t1; mysql> insert into testdb.t1 values(1); #插入数据1,模拟周一 mysql> select * from testdb.t1; +------+ | id | +------+ | 1 | +------+ mysql> \q 查看时间: [root@mysql-server ~]# date Tue Aug 20 15:39:59 CST 2019 1、完整备份:周一 [root@mysql-server ~]# innobackupex --user=root --password='123' /xtrabackup 2、差异备份:周二 —— 周三 语法: # innobackupex --user=root --password=888 --incremental /xtrabackup --incremental-basedir=/xtrabackup/完全备份目录(周一) 3.修改时间: [root@mysql-server ~]# date 08211543 Wed Aug 21 15:43:00 CST 2019 4.在登陆mysql: mysql> insert into testdb.t1 values(2); #插入数据2,模拟周二 差异备份周二的 [root@mysql-server ~]# innobackupex --user=root --password='123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2019-08-20_15-42-02/ #备份目录基于周一的备份 5.再次登陆mysql mysql> insert into testdb.t1 values(3); #插入数据,模拟周三 6.在次修改时间 [root@mysql-server ~]# date 08221550 Thu Aug 22 15:50:00 CST 2019 7.再次差异备份 [root@mysql-server ~]# innobackupex --user=root --password='123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2019-08-20_15-42-02/ #还是基于周一的备份 8.延伸到周四 mysql> insert into testdb.t1 values(4); 9.修改时间 [root@mysql-server ~]# date 08231553 Fri Aug 23 15:53:00 CST 2019 10.差异备份周四 [root@mysql-server ~]# innobackupex --user=root --password='123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2019-08-20_15-42-02/ #还是基于周一的备份 11.查看一下备份目录 [root@mysql-server ~]# ls /xtrabackup/ 2019-08-20_15-42-02 2019-08-21_15-46-53 2019-08-22_15-51-15 2019-08-23_15-53-28 周一 周二 周三 周四
差异备份恢复流程 1. 停止数据库 2. 清理环境 3. 重演回滚redo log(周一,某次差异)--> 恢复数据 4. 修改权限 5. 启动数据库 6. binlog恢复 停止数据库 [root@mysql-server ~]# systemctl stop mysqld [root@mysql-server ~]# rm -rf /var/lib/mysql/* 1.恢复全量的redo log 语法: # innobackupex --apply-log --redo-only /xtrabackup/完全备份目录(周一) [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-08-20_15-42-02/ 2.恢复差异的redo log 语法:# innobackupex --apply-log --redo-only /xtrabackup/完全备份目录(周一)--incremental-dir=/xtrabacku/某个差异备份 这里我们恢复周三的差异备份 [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/2019-08-20_15-42-02/ --incremental-dir=/xtrabackup/2019-08-22_15-51-15/ #我们恢复周三的差异备份 3.恢复数据 语法:# innobackupex --copy-back /xtrabackup/完全备份目录(周一) [root@mysql-server ~]# innobackupex --copy-back /xtrabackup/2019-08-20_15-42-02/ 修改权限: [root@mysql-server ~]# chown -R mysql.mysql /var/lib/mysql [root@mysql-server ~]# systemctl start mysqld
登陆mysql查看一下:
只有123.因为我们恢复的是周三的差异备份。
推荐阅读
-
就业类第 2 阶段 2401--3.21 天3 备份
-
科比鹰郡事件始末最强解析(全文)-插曲:OK两人最初的相识。OK两人在齐聚湖人之前就曾相遇。1992年,14岁的科比通过父亲的关系,进入了奥兰多更衣室向便士哈达威索要签名,但遭到置之不理,反倒是新秀时期的奥尼尔对科比鼓励有加,不仅给他签名,还和科比聊了很多,并且希望日后能在NBA看见科比,没想到一语成真,后者真的成为了他的队友,这也是日后奥尼尔对于科比和自己的矛盾产生仇恨心里的原因,因为奥尼尔始终认为最初对科比的善意没有换来以德报德。 多年以后,鹰郡事件女主角凯特琳澄清事实。据她自述,当时她是为了给母亲凑医药费,设法和科比发生关系,目的就是为了钱,科比支付的赔偿金拯救了她的母亲。最终事情真相浮出水面,这是有预谋的“仙人跳”讹诈,但是好事依然不出门。 不得不说,鹰郡事件是科比犯下的错。自此,除了篮球以外,科比将更多的时间回归家庭。然而鹰郡事件最大的受害者是科比本人和他的妻子瓦妮莎。那么他们都有哪些损失呢? 在道德上:科比饱受批评,引发不少妇女团体对他不满,甚至受人唾弃。 image 在家庭上:科比与瓦妮莎产生了信任危机,尤其是瓦妮莎的流产导致这个家庭失去了第二个孩子,而这个孩子或许是科比夫妇唯一的儿子。因此这件事让科比一直很后悔。 在金钱上:科比的律师费(至少1200万美元)、赔偿费(不少于500万美元)、再加上往返奔波费、诉讼费等估计超过2000万美金。此外商业上严重受阻,商业价值跌落谷底,赞助商几乎抛弃了他,阿迪达斯也在这个时候和科比解约。其经济损失不可估量。 在事业上:球迷的质疑和谩骂声音不断;湖人队内部发生微妙变化,队友和他有了一定距离;禅师菲尔杰克逊在得知科比“强奸”女性后更是对他区别对待,因为禅师的女儿曾经经历了强奸,他对科比十分厌恶,间接地导致禅师离开了湖人队;OK这对王炸组合解散;大卫斯特恩放弃了科比的造神计划,迅速将资源推向了詹姆斯;赛场上,虽然科比有着赶场法则的传奇,但就整个03—04赛季而言,科比表现起起伏伏,整体状态下滑明显。 image 不可否认,鹰郡事件导致科比处在生涯最低谷的时刻,那个阶段也许只有麦迪经常陪在科比身边给他带来一些安慰。但接下来科比以他顽强的意志和超乎常人的努力为自己进行救赎:三节打卡62分、单场81分神迹、连续4场50+、更改球衣号码变成黑曼巴、连续双一阵、MVP、奥运会冠军、两连冠+FMVP…… 现在回想起来,连当时受伤害最大的瓦妮莎都选择原谅了科比,但键盘侠们依然指指点点。 2018年3月5日,科比凭借其亲自参与制作并配音的退役动画短片《亲爱的篮球》获得了第90届奥斯卡“最佳动画短片奖”,而“小金人”的巨大荣誉,让奥尼尔都自嘲“兄弟,你真的让我羡慕!真没法追逐你了”,同时他也因此被选为了Animation Is电影节的评委。 image 随后科黑以“鹰郡事件”为理由向奥斯卡请愿,要收回科比的小金人,虽然小金人未收回,但10月18日,科比被取消了电影节的评委资格。 时间回到2020年。 1月26日科比因直升机坠毁意外身亡。斯人已逝,可喷子们还是没有放过他。有些人甚至借科比死亡这一消息来蹭热度! 就在科比去世的第二天,美国女演员埃文·蕾切尔·伍德(Evan Rachel Wood)在推特上称呼科比为“强奸犯”,遭到美国网友们的强烈反对。 一周后,据2月3日《每日邮报》消息,迪斯尼的女继承人阿比盖尔·迪斯尼在社交网络上连续发了24个帖子,直指2003年科比的性侵事件,认为科比犯强奸罪,强调科比不该被神化,他不是上帝。 但也有很多人相信科比没有强奸,据2月4日《每日邮报》报道,WNBA传奇女篮运动员丽莎·莱斯利为科比辩护,认为科比不是用武力侵犯女性的人,科比的妻子也一直在维护自己逝去的丈夫…… image 然而,不管是怎样的事实,即使法律宣判了科比无罪,即使是被敲诈勒索,成为受害人,可事到如今,科比依然被很多人戴上“强奸犯”的帽子,对于一个已经逝世的人来说,这是他最大的损失。 插曲:中国官方媒体对科比的态度,只列举一下几个主要媒体。