author:JevonWei

版权声明:原创作品

blog:http://119.23.52.191/

数据备份和恢复

mysqldump

冷备份单库(不会创建新库,需要手动创建并指定导入数据的库)
将本机的mydb数据库备份到/app/mydb.backup-$(date +%F-%H-%M-%S)文件
[root@danran ~]# mysqldump mydb > /app/mydb.backup-$(date +%F-%H-%M-%S)
[root@danran ~]# ll /app/mydb.backup-2017-09-12-14-18-44
-rw-r--r--. 1 root root 70488 Sep 12 14:18 /app/mydb.backup-2017-09-12-14-18-44

恢复数据

新建一个数据库做示例
MariaDB [(none)]> CREATE DATABASE testdb; 将备份的数据库文件导入到testdb新建数据库中
[root@danran ~]# mysql testdb < /app/mydb.backup-2017-09-12-14-18-44 进入到testdb测试数据库中,查看数据是否恢复
MariaDB [testdb]> use testdb;
MariaDB [testdb]> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| students |
+------------------+

冷备份多个库文件(可自动创建新库)

mysql节点A备份数据
[root@danran ~]# mysqldump --databases mydb testdb mysql > /app/mydb-testdb-mysql-backup-$(date +F-%H-%M-%S) mysql及节点B远程恢复数据
创建并授权恢复数据时使用的账号
MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'172.16.253.105' IDENTIFIED BY 'admin';
MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'%.danran.com' IDENTIFIED BY 'admin';
MariaDB [(none)]> FLUSH PRIVILEGES; Mysql节点A将备份的多库数据文件导入到远程mysql服务器节点B
[root@danran ~]# mysql -uadmin -h'172.16.253.108' -padmin < /app/mydb-testdb-mysql-backup-F-14-32-28 Mysql节点B查看数据是否恢复成功,即mydb,testdb,mysql文件恢复成功
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| testdb |
+--------------------+

InnoDB引擎热备份数据文件

备份前应该先将所有表锁定
MariaDB [testdb]> FLUSH TABLES WITH READ LOCK;
滚动数据库
MariaDB [testdb]> FLUSH LOGS;
查看二进制日志文件
MariaDB [testdb]> SHOW MASTER LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-log.000001 | 289 |
| master-log.000002 | 654 |
| master-log.000003 | 69738 |
| master-log.000004 | 245 |
+-------------------+-----------+ 热备份数据库文件
[root@danran ~]# mysqldump --single-transaction mydb > /app/mydb-backup-$(date +%F-%H-%M-%S);
数据恢复如上

模拟数据温备份与数据恢复

开启二进制日志文件记录
[root@danran ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
log_bin=master-log
[root@danran ~]# systemctl restart mariadb 有可以远程登录进行数据恢复的用户,进而使用远程恢复数据
MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'172.16.253.%' IDENTIFIED BY 'admin';
MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'%.danran.com' IDENTIFIED BY 'admin'; \\防止反解主机名
MariaDB [(none)]> FLUSH PRIVILEGES; 滚动数据库
MariaDB [testdb]> FLUSH LOGS; 温备份所有数据库文件到远程服务器
[root@danran ~]# mysqldump -x -R -E --triggers --all-databases --master-data=1 > /tmp/alldatabases-backup-$(date +%F-%H-%M-%S);
[root@danran ~]# mysqldump -x -R -E --triggers --all-databases --master-data=2 --flush-logs > /tmp/alldatabases-backup-$(date +%F-%H-%M-%S); 创建新表,此新表不在备份的文件中,而仅仅存在于二进制日志文件中
MariaDB [mydb]> CREATE TABLE teachers (tid INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,name VARCHAR(200));
插入数据
MariaDB [mydb]> INSERT INTO teachers (name) VALUES ('LI'),('WEI');
MariaDB [mydb]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000006 | 628 | | |
+-------------------+----------+--------------+------------------+ mariadb服务器损坏,所有的数据文件丢失,但备份的二进制日志文件/var/lib/mysql/master-log.000006仍然存在
[root@danran ~]# systemctl stop mariadb 将备份之后的所有二进制日志文件读取出来并保存到文件中
[root@danran ~]# mysqlbinlog /var/lib/mysql/master-log.000006 > /app/alldatabase.binlog 模拟数据文件全部丢失
[root@danran ~]# rm -rf /var/lib/mysql/* 数据库恢复启动之后,所有库文件丢失
[root@danran ~]# systemctl start mariadb
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+ 先暂时关闭二进制日志文件
[root@danran ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
#log_bin=master-log
[root@danran ~]# systemctl restart mariadb 将备份文件和二进制日志文件依次恢复数据
[root@danran ~]# mysql -uadmin -h172.16.253.108 -padmin < /tmp/alldatabases-backup-2017-09-12-15-07-37;
[root@danran ~]# mysql -uadmin -h172.16.253.108 -padmin < /app/alldatabase.binlog
登录数据库,数据以完全恢复
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+ MariaDB [(none)]> use mydb;
MariaDB [mydb]> SHOW TABLES; \\teachers表是从二进制日志文件中恢复而来
+----------------+
| Tables_in_mydb |
+----------------+
| students |
| teachers |
+----------------+ 开启二进制日志文件记录
[root@danran ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
log_bin=master-log
[root@danran ~]# systemctl restart mariadb

Xtrabackup

下载Xtrabackup软件包,官网为http://www.percona.com/software/percona-xtrabackup/
安装Xtrabackup软件包
[root@danran ~]# ls percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
[root@danran ~]# yum -y install ./percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
[root@danran ~]# rpm -ql percona-xtrabackup-24
[root@danran ~]# man xtrabackup 创建备份存放目录
[root@danran ~]# mkdir /mydata/xbdata -pv 备份本地数据库文件到mydata/xbdata
[root@danran ~]# innobackupex --user=root --host=localhost [--password] /mydata/xbdata
[root@danran ~]# ls /mydata/xbdata/2017-09-12_16-45-10/
backup-my.cnf mydb performance_schema testdb xtrabackup_info
ibdata1 mysql test xtrabackup_checkpoints xtrabackup_logfile [root@danran ~]# less /mydata/xbdata/2017-09-12_16-45-10/backup-my.cnf \\ mysql关键配置文件信息
[root@danran ~]# less /mydata/xbdata/2017-09-12_16-45-10/ibdata1 \\表空间文件
[root@danran ~]# less /mydata/xbdata/2017-09-12_16-45-10/xtrabackup_binlog_info \\备份时自动记录处于二进制日志文件的哪个位置
[root@danran ~]# less /mydata/xbdata/2017-09-12_16-45-10/xtrabackup_checkpoints
backup_type = full-backuped 记录了备份类型为 full-backuped
from_lsn = 0 范围内的所有数据
to_lsn = 2085723
last_lsn = 2085723
compact = 0
recover_binlog_info = 0
[root@danran ~]# less /mydata/xbdata/2017-09-12_16-45-10/xtrabackup_info \\记录了备份程序文件的信息

基于全量备份恢复数据

模拟数据库损坏
[root@danran ~]# systemctl stop mariadb
[root@danran mysql]# rm -rf /var/lib/mysql/* 恢复还原数据 [root@danran ~]# cd /mydata/xbdata/2017-09-12_16-45-10/
同步该同步的数据
[root@danran 2017-09-12_16-45-10]# innobackupex --apply-log ./
将当前目录拷贝到/var/lib/mysql
[root@danran 2017-09-12_16-45-10]# innobackupex --copy-back ./
[root@danran 2017-09-12_16-45-10]# cd /var/lib/mysql
修改/var/lib/mysql目录下的所有文件属主、属组为mysql
[root@danran mysql]# chown -R mysql.mysql ./*
启动mariadb服务
[root@danran mysql]# systemctl start mariadb 登录数据库,数据已完全恢复
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| test |
| testdb |
+--------------------+

模拟数据备份与恢复

数据库中插入大量数据,用做测试
MariaDB [mydb]> create table students (stuid INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,name VARCHAR(200),age TINYINT UNSIGNED,gender ENUM('F','M'),major VARCHAR(200));
[root@danran ~]# for i in {5..1000};do mysql -e "INSERT INTO mydb.students VALUES ('$i','stu$i',$[$RANDOM%100+1],'F','major$i')";done
[root@danran ~]# for i in {1001..2000};do mysql -e "INSERT INTO mydb.students VALUES ('$i','stu$i',$[$RANDOM%100+1],'M','major$i')";done 开启二进制日志文件记录
[root@danran ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
log_bin=master-log 1. 数据库创建备份用户并授予最小权限
mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’admin’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;
2. 完全备份所有库,即全量备份
[root@danran ~]# innobackupex /mydata/xbdata/ \\备份所有库文件到/mydata/xbdata/
[root@danran ~]# cd /mydata/xbdata/2017-09-12_17-09-40/
[root@danran 2017-09-12_17-09-40]# cat xtrabackup_checkpoints
backup_type = full-backuped \\完全备份
from_lsn = 0
to_lsn = 2085937 \\结束日志序列号为2085937
last_lsn = 2085937
compact = 0
recover_binlog_info = 0
3. 登录数据库,修改数据
MariaDB [(none)]> use mydb;
MariaDB [mydb]> DELETE FROM students WHERE stuid=1300; \\修改数据文件
MariaDB [mydb]> DELETE FROM students WHERE stuid=1400; 4. 增量备份
[root@danran ~]# innobackupex --incremental /mydata/xbdata/ --incremental-basedir=/mydata/xbdata/2017-09-12_17-09-40 \\--incremental意为当前为增量备份,--incremental-basedir意为以哪个目录为基准做增量备份
[root@danran ~]# cd /mydata/xbdata/2017-09-12_17-18-39/ \\增量备份文件
[root@danran 2017-09-12_17-18-39]# ls
backup-my.cnf mydb test xtrabackup_info
ibdata1.delta mysql testdb xtrabackup_logfile
ibdata1.meta performance_schema xtrabackup_checkpoints
[root@danran 2017-09-12_17-18-39]# less xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2085937 \\增量备份的开始,同时也为完全备份的结束点
to_lsn = 2088070 \\结束日志序列号为2085937
last_lsn = 2088070
compact = 0
recover_binlog_info = 0 4. 数据库中的数据再次发生变化
MariaDB [mydb]> INSERT INTO teachers (name) VALUES ('xin'); \\teschers表中插入数据,从而使数数据发生变化
MariaDB [mydb]> SELECT * FROM teachers;
+-----+------+
| tid | name |
+-----+------+
| 1 | LI |
| 2 | WEI |
| 3 | xin |
+-----+------+
5. 再次增量备份
[root@danran ~]# innobackupex --incremental /mydata/xbdata/ --incremental-basedir=/mydata/xbdata/2017-09-12_17-18-39 \\以上次增量为基准做增量备份
[root@danran ~]# cat /mydata/xbdata/2017-09-12_17-27-51/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2088070 \\日志序列号开始,同时为上一此增量序列号的结束
to_lsn = 2088893 \\当前结束序列号
last_lsn = 2088893
compact = 0
recover_binlog_info = 0
6. 数据库中的数据再次发生变化
MariaDB [mydb]> DELETE FROM teachers WHERE name='LI';
MariaDB [mydb]> SELECT * FROM teachers;
+-----+------+
| tid | name |
+-----+------+
| 2 | WEI |
| 3 | xin |
+-----+------+
7. 查看最后一次备份的xtrabackup_info文件中的binlog_pos位置
[root@danran ~]# cat /mydata/xbdata/2017-09-12_17-38-44/xtrabackup_info
uuid = 2c60babb-979e-11e7-b88f-000c290e4787
name =
tool_name = innobackupex
tool_command = --incremental /mydata/xbdata/ --incremental-basedir=/mydata/xbdata/2017-09-12_17-27-51
tool_version = 2.4.7
ibbackup_version = 2.4.7
server_version = 5.5.52-MariaDB
start_time = 2017-09-12 17:38:44
end_time = 2017-09-12 17:38:46
lock_time = 0
binlog_pos = filename 'master-log.000001', position '709' \\binlog_pos位置为master-log.000001中的709
innodb_from_lsn = 2088893
innodb_to_lsn = 2090173
partial = N
incremental = Y
format = file
compact = N
compressed = N
encrypted = N
8. 读取二进制日志文件
[root@danran ~]# mkdir /mydata/binlogs \\新建存放读取二进制文件后数据的目录
[root@danran ~]# mysqlbinlog -j 709 /var/lib/mysql/master-log.000001 > /mydata/binlogs/2017-09-12_17-38-44-binlog
从master-log.000001二进制文件的709节点开始读取数据并保存在/mydata/binlogs/2017-09-12_17-38-44-binlog文件中
9. 模拟服务器损坏
[root@danran ~]# systemctl stop mariadb
[root@danran ~]# rm -rf /var/lib/mysql/*
10. 恢复数据
[root@danran ~]# cd /mydata/xbdata/2017-09-12_17-09-40/ \\进入完全备份目录
[root@danran 2017-09-12_17-09-40]# innobackupex --apply-log --redo-only ./ \\对当前目录仅做重做,不做撤销回滚
[root@danran 2017-09-12_17-09-40]# innobackupex --apply-log --redo-only ./ --incremental-dir=/mydata/xbdata/2017-09-12_17-18-39
在完全备份目录下,指定第一次增量备份的目录,做重做操作
[root@danran 2017-09-12_17-09-40]# innobackupex --apply-log --redo-only ./ --incremental-dir=/mydata/xbdata/2017-09-12_17-27-51
在完全备份目录下,指定第二次增量备份的目录,做重做操作
[root@danran 2017-09-12_17-09-40]# innobackupex --apply-log --redo-only ./ --incremental-dir=/mydata/xbdata/2017-09-12_17-38-44
在完全备份目录下,指定第三次增量备份的目录,做重做操作
[root@danran 2017-09-12_17-09-40]# cat xtrabackup_checkpoints
backup_type = log-applied
from_lsn = 0
to_lsn = 2090173 日志序列号已重读到最后一次备份的时刻
last_lsn = 2090173
compact = 0
recover_binlog_info = 0 增量命令执行完毕后,在当前完全备份目录下执行回滚操作
[root@danran 2017-09-12_17-09-40]# innobackupex --apply-log ./ 将当前目录拷贝到/var/lib/mysql
[root@danran 2017-09-12_17-09-40]# innobackupex --copy-back ./
11. 修改/var/lib/mysql目录下的所有文件属主、属组为mysql
[root@danran 2017-09-12_17-09-40]# cd /var/lib/mysql
[root@danran mysql]# chown -R mysql.mysql ./*
12. 启动mariadb服务
[root@danran mysql]# systemctl start mariadb
13. 登录数据库查看数据,数据恢复到最后一次增量备份前的数据,最后一次增量备份后删除的数据LI没有恢复
MariaDB [mydb]> SELECT * FROM students WHERE stuid=1300; \\数据以删除
MariaDB [mydb]> SELECT * FROM students WHERE stuid=1400; \\数据以删除 MariaDB [mydb]> SELECT * FROM teachers;
+-----+------+
tid | name |
+-----+------+
| 1 | LI |
| 2 | WEI |
| 3 | xin |
+-----+------+
14. 重放二进制日志文件重记录的sql语句
MariaDB [mydb]> SET @@session.sql_log_bin=OFF \\暂时关闭会话中的写操作记录二进制日志
MariaDB [mydb]> \. /mydata/binlogs/2017-09-12_17-38-44-binlog
15. 登录数据库,查看数据恢复情况,数据恢复到mysql服务器崩溃前的状态
MariaDB [mydb]> SELECT * FROM teachers;
+-----+------+
| tid | name |
+-----+------+
| 2 | WEI |
| 3 | xin |
+-----+------+
16. 打开之前关闭的写操作记录日志的功能
MariaDB [mydb]> SET @@session.sql_log_bin=ON; 17. 即刻在做一次全量备份
[root@danran ~]# innobackupex /mydata/xbdata/
18. mysql数据库上线

Mysql实战之数据备份的更多相关文章

  1. NoSQL 数据库案例实战 -- MongoDB数据备份、恢复

    MySQL数据迁移到MongoDB数据库中 前言 一.数据备份 二.数据恢复 前言 本环境是基于 Centos 7.8 系统构建mongodb-enterprise-4.2.8学习环境具体构建,请参考 ...

  2. Mysql(六):数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...

  3. python之路--MySQL权限管理 数据备份还原

    一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...

  4. MySql笔记之数据备份与还原

    MySQL数据备份.还原与迁移 一.数据备份------mysqldump 1.语法: mysqldump -u user(用户名)-h host(登录用户的主机名称)-p password(登录密码 ...

  5. mysql七:数据备份、pymysql模块

    阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...

  6. mysql六:数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 掌握: #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表 ...

  7. 六、MySQL系列之数据备份(六)

    本篇主要介绍用户授权.以及数据备份等知识: 一.用户授权 首先我们需要知道的是: 所有的用户及权限信息都存储在mysql数据库下的user表中,故我们可以通过查看user表的记录来查看用户权限信息,当 ...

  8. MySQL之mysqldump数据备份还原

    一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理 ...

  9. MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】

    不管是Oracle数据库还是SQL Server数据库,每个数据库都有自己的一套数据备份和恢复的方法,MySQL数据库也不例外.MySQL数据库备份和恢复用到了两个命令,分别是“mysqldump”和 ...

随机推荐

  1. 【BZOJ2002】[HNOI2010] 弹飞绵羊(大力分块)

    点此看题面 大致题意: 有\(n\)个弹力装置,当到达第\(i\)个装置时,会被弹到第\(i+k_i\)个装置,若不存在第\(i+k_i\)个装置,就会被弹飞.有两种操作,一种操作是将\(k_x\)改 ...

  2. basic_double_stream_incorrect

    不合理的代码 /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. * * NVIDIA Corporation and ...

  3. IBM MQ Explore使用

    一,版本说明: 系统:win10.MQ:V9.04 二.关于帮助文档: 1.读了差不多一大半,个人感觉说明的比较生僻,应该是直译过来的.但是还是可以从这里面学一下基本的操作. 2.对于一些基本的操作, ...

  4. webpack4.x ,1基本项目构建 详解

    1.先创建个文件夹 比如叫 webApp 用编译器打开 2.安装全局的webpack 和webpack-cli 及 webpack-dev-server 命令如下 npm install webpac ...

  5. python3 练习题100例 (十)

    题目十:判断101-200之间有多少个素数,并输出所有素数. #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 题目十 ...

  6. 使用JFreeChart生成报表

    1.JFreeChart简介    JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications,servlets以及JSP等使用所设计.  ...

  7. Java-数据结构之栈练习

    栈(stack)可以看做是特殊类型的线性表,访问.插入和删除其中的元素只能在栈尾(栈顶)进行. 队列(queue)表示一个等待的线性表,它也可以看做是一种特殊类型的线性表,元素只能从队列的末端(队列尾 ...

  8. django 自定义过滤器中的坑.

    今天在创建自定义过滤器的时候,设置已正常.但是在运行后报: 'filter' is not a valid tag library: Template library filter not found ...

  9. Android开发环境安装经验

    前段时间在一个安装论坛上,下载了老罗的Android学习视频,看到第三节就卡住了。我这边Eclipse安装SDK总是不成功,报各种错误。断断续续好几天的摸索,终于弄明白了。 首先要安装ADT插件,也就 ...

  10. 做一个日收入100元的APP!

    [导语]虽然讲了很多个人开发者的文章,但新手开发者如何赚自己的第一个100块钱,确是最难的事情.群里有人说都不知道干什么 app赚钱,完全没有想法, 并且经常问我有什么快速赚钱的方法.我只能遗憾地说, ...