开源数据库MYSQL DBA运维实战 第三章 备份

一、关于备份

1.备份原因

丢/删

2.备份目标

1.数据的一致性

2.服务的可用性

3.备份技术

3.1物理备份/冷备份

直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的mysql

tar,cp,scp

拷贝数据,有点快,缺点服务停止

3.2逻辑备份/热备份

备份的是建表,建库,插入等操作所执行SQL语句(DDL,DML,DCL),

mysqldump,mydumper

效率相对较低

4.备份方式

4.1完全备份

4.2增量备份

4.3差异备份

二、实战案例1

percona-xtrabackup

简介

它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;为mysql做增量备份:在mysql服务器之间做在线表迁移:使创建replication更加容易;备份mysql而不增加服务器的负载。

percona是一家老牌的mysql技术咨询公司。它不仅提供mysal的技术支持、培训、咨询,还发布了mysql的分支版本--percona Server。并围绕perconaServer还发布了一系列的mysql工具。

获得软件包

官网站点:https://www.percona.com/

选择版本

安装

安装YUM仓库

安装percona需要的mysql包

安装precona的yum仓库

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

YUM安装percona-xtrabackup

yum install -y percona-xtrabackup-24.x86_64

查询安装结果

yum list | grep percona-xtrabackup

1.完全备份流程

innobackupex --user=root --password='Root123@' /xtrabackup/full

ls /xtrabackup/full 查看备份目录,数据库,配置文件,日志文件

/xtrabackup/full/2017-08-01 00-00-02/

观察二进制日志位置

cat /xtrabackup/full/2017-08-01 00-00-18/xtrabackup_binlog_info

2.完全恢复流程

停止数据库

systemctl stop mysql

清理环境(模拟损坏)

rm -rf /var/lib/mysql/*

rm -rf /var/log/mysqld.log

生成回滚日志

innobackupex --apply-log /xtrabackup/full/2017-08-01 00-00-18/ 指定被分点

恢复文件

innobackupex --copy-back /xtrabackup/full/2017-08-01 00-00-18/

登录验证

ls /var/lib/mysql

chown -R mysql.mysql /var/lib/mysql

systemctl start mysqld

mysql -uroot -p'Root123@'

3.增量备份流程

准备工作

完整备份:周一

rm -rf /xtrabackup/*

date 09010000

innobackupex --user=root --password='Root123@' /xtrabackup

ll /xtrabackup/ 2017-09-01 00-00-04

请问数据库中的增量是多少? 1

增量备份:周二

date 09020000 更新时间

mysql -uroot -p'Root123@' -e 'insert into testdb.test value(2)'

innobackupex --user=root --password='Root123@' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2017-09-01 00-00-04

basedir基于周一的备份,会生成一个今天的

ls /xtrabackup/

增量备份:周三

date 09030000 更新时间

mysql -uroot -p'Root123@' -e 'insert into testdb.test value(3)'

innobackupex --user=root --password='Root123@' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2017-09-02 00-00-04

basedir基于周2的备份,会生成一个今天的

ls /xtrabackup/

周四。。周五。。周六

4.增量恢复流程

停止数据库

systemctl stop mysqld

清理环境

rm -rf /var/lib/mysql/*

周一

innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04 回滚合并

周二

innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04

--incremental-dir=/xtrabackup/2017-09-02 00-00-04

恢复

innobackupex --copy-back /xtrabackup/2017-09-01 00-00-06/ .

chown -R mysql.mysql /var/lib/mysql

systemctl start mysqld

登录查询记录,请思考记录是第几天的,想恢复3,怎么办?

systemctl stop mysqld

innobackupex --apply-log --redo-only /xtrabackup/2017-09-01_00-00-04 --incremental-dir=/xtrabackup/2017-09-03_00-00-27

rm -rf /var/lib/mysql*

innobackupex -copy-back /xtrabackup/2017-09-01_00-00-04

chown -R mysq.mysql /var/lib/mysql

systemctl start mysqld

mysql -uroot -p'Root123@' -e 'select * from testdb.test'

请思考,如何一次性把数据,周一,周二,周三恢复出来?

5.差异备份流程

rm -rf /xtrabackup/*

1.完整备份

周一

date 10010000

create database testdb;

use testdb;

create table test(id int);

insert into test2 values(1);

select * from test2;

innobackupex --user=root --password='Root123@' /xtrabackup

ls /xtrabackup 看是否备份成功

2.差异备份

周二

date 10020000

mysql -uroot -p'Root123@' -e 'insert into testdb.test2 value(2)'

innobackupex --user=root --password='Root123@' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2017-10-01 00-01-12

周三

date 10030000

mysql -uroot -p'Root123@' -e 'insert into testdb.test2 value(3)'

innobackupex --user=root --password='Root123@' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2017-10-01 00-01-12

周四

date 10040000

mysql -uroot -p'Root123@' -e 'insert into testdb.test2 value(4)'

innobackupex --user=root --password='Root123@' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2017-10-01 00-01-12

6.差异恢复流程

停止数据库

systemctl stop mysqld

清理环境

rm -rf /var/lib/mysql/*

重演回滚redo log(周一,某此差异)------->恢复数据

innobackupex --apply-log --redo-only /xtrabackup/2017-10-01_00-01-12

innobackupex --apply-log --redo-only /xtrabackup/2017-10-01_00-01-12

--incremental-dir=/xtrabackup/2017-10-04_00-00-29

innobackupex --copy-back /xtrabackup/2017-10-01_00-01-12

chown -R mysql.mysql /var/lib/mysql 修改权限

systemctl start mysqld 启动mysqld

通过binlog增量恢复(略)

三、实战案例2

mysqldump+binlog

1.优势

1.自动记录日子position位置

2.可用性,一致性

2.语法

mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql -h不写是对本机
-single-transaction innodb 一致性,服务可用性,不关机的备份

--master-data=1|2 该选项将会记录binlog的日志位置与文件名并追加到文件中

master-data=2 注释掉日志记录

帮助

mysqldump --help

3.备份实战

3.1准备两套root密码

密码1:Root123@ 配置到当前数据库中

密码2:Root1234@ 备用

3.2准备库1

create database testdb1;

use testdb;

create table t1(id int);

insert into t1 values(1),(2),(3);

select * from t1;

3.3执行备份

mysqldump -p'Root123@' --all-databases --single-transaction --master-data=2 --flush-logs > /backup/`date +%F-%H` -mysql-all.sql

3.4观察备份细节

vim /backup/2016-11-25-14-mysql-all.sql

LOCAK TABLES `user` WRITE mysqldump的锁机制,来保证数据一致性

22行 CHANGE MASTER TO MASTER LOG FILE=ocalhost-bin.000004MASTER LOG POS=154:

3.5备份后的,数据变更行为

4.恢复实战

4.1备份二进制日志文件

cp /var/lib/mysql/*bin* ~

4.2停止数据库

systemctl stop mysqld

4.3清理环境

rm -rf /var/lib/mysql/*

4.4启动数据库

systemctl start mysqld

grep 'password' /var/log/mysqld.log 找密码,再改一下密码,使用密码2

mysqladmin -uroot -p'd-tlbwIgP3e2' password "Root1234@" password后面有空格

4.5mysql恢复数据

mysql -p'Root1234@' < /backup/2016-11-25-14-mysql-all.sql

mysql -p'Root1234@' -e 'flush privileges' 一重启之后变成了密码1

登录并验证数据恢复结果,请思考恢复的数据库有几个? 1个

4.6二进制日志恢复

观察二进制截取记录

vim /backup/2016-11-25-14-mysql-all.sql

第22行 CHANGE MASTER TO MASTER LOG FILE=ocalhost-bin.000004MASTER LOG POS=154:

mysqlbinlog localhost-bin.000002 localhost-bin000003-start-position=154mysql-p'Root123@'

注意后续有多少日志,就要跟多少日志名字

4.7观察数据

恢复完整

4.8请思考误删除的问题.

如何保留误删的testdb3库

[root@localhost -]#mysglbinlog localhost-bin.00004.....005.....006...... > 1.txt

删除1.txt中不需要的at(比如test3库是误操作)

cat 1.txt I mysgl -p'Root123@'

4.9关于数据恢复时的多余日志

方法二:在备份文件中,加入关闭二进制日志

四、实战案例3---记录的导出和导入

1.记录导出

注意目录权限

vim /etc/my.cnf

secure-file-priv=/backup mysql不信任该目录(要重启mysql程序)

chown mysql.mysql /backup mysql用户没有权限

SELECT...INTO OUTFILE 导出文本文件

mysql> SELECT * FROM testdb1.t1 INTO OUTFILE '/backup/testdb1.t1.txt';

mysql命令导出文本文件

mysql-uroot -p'QianFeng@123' -e 'select * from testdb1.t1' > /backup/testdb1.t2.txt

mysql-u root -p'QianFeng@123' --xml-e 'select * from testdb1.t1' > /backup/testdb1.t3.txt

mysql-u root -p'QianFeng@123' --html -e 'select * from testdb1.t1' > /backup/index.html

2.LOAD DATA INFILE导入文本文件.

注意目录权限

vim /etc/my.cnf

secure-file-priv=/backup mysql不信任该目录(要重启mysql程序)

chown mysql.mysql /backup mysql用户没有权限

删除表的内容,标的到处和导入只备份表记录,不会备份表结构,因此需要通过mysqldump备份表结构,恢复时先恢复表结构,再导入数据

delete from testdb1.t1
LOAD DATA INFILE '/backup/testdb1.t1.txt' INTO TABLE testdb1.t1;

select * from testdb1.t1;

相关推荐
打鱼又晒网30 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!35 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix1 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。2 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了2 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度2 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮2 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9993 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️3 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发