MySQL 八、数据库备份和还原
 
 
 
1、二进制日志相关配置
 
 
1)查看使用中的二进制日志文件列表,及大小
 
  SHOW {BINARY | MASTER} LOGS
 
  ex: show master logs;
  show binary logs;
 
这两个命令是一样的

物理大小

2)查看使用中的二进制日志文件
 
SHOW MASTER STATUS;
 
表示当前二进制数据库,处于什么位置(下图中当前处于245位置)

当对表进行修改后,可看到位置发生了变化
 
update students set name='Shi Banyu' where stuid=1;
show master status;

 
3)查看查看二进制文件中的指定内容
 
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
 
ex: show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3
 
show binlog events in 'a.000002';

 
show binlog events in 'a.000002' from 245;

2、二进制日志客户端命令工具:mysqlbinlog
 
 
 
1)生成新日志文件: flush logs
 
flush logsl 触发生成新的日志

生成新的日志a.000003,

新的事件将记录到这个新的日志文件里

2)窥探二进制文件的内容
 
mysqlbinlog [OPTIONS] log_file…
 
ex: mysqlbinlog /data/mylog/a.000003
 
对表做一次修改

再查看二进制日志文件,可看到:
at 245及之后的位置,记录了数据库发生的改变。
因此,也就可以利用二进制文件,来还原数据库

3)一个还原的小实验
 
将二进制文件导出到文件
mysqlbinlog /data/mylog/a.000003 > bin.sql
 
对表再次进行修改:
 
update students set name='Shi Po Tiandi' where stuid=2;
select * from students;
 
将修改之前的二进制文件内容,再导入到数据库中(猜猜会发生什么?)
mysql < bin.sql
 
表又复原到修改之前的状态了
 
可以看到

4)mysqlbinlog客户端命令参数
 
mysqlbinlog [OPTIONS] log_file…
 
--start-position=# 指定开始位置
--stop-position=#
--start-datetime=
--stop-datetime=
 
时间格式:YYYY-MM-DD hh:mm:ss
--base64-output[=name]
 
示例:
 
mysqlbinlog --start-position=6787 --stop-position=7527 /var/lib/mysql/mariadb-bin.000003
 
mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003;
 
 
 
ex:
 
mysqlbinlog /data/mylog/a.000003 --start-position=316 --stop-position=431
 
5)删除二进制日志文件
 
PURGE { BINARY | MASTER } LOGS
{ TO 'log_name' | BEFORE datetime_expr }
 
 
删除指定日志文件之前的文件
purge binary logs to 'a.000003'; (删除到3,3之前的都删掉)

删除所有二进制日志,index文件重新记数
 
RESET MASTER [TO #];
 
日志文件从#开始记数,默认从1开始,一般是master第一次启动时执行,MariaDB10.1.6开始支持TO #
 
RESET MASTER; 彻底删除,重新计数

二、备份和恢复
 
 
1)全备份、增量备份示意(每周全备、每日增量备份)
 
全 增 增 增 增 增 增
+--------+-------+---------+------+-------+-------+
日 一 二 三 四 五 六
 
 
2)默认mysql备份相关配置
 
 
 
 
分库、分表
innodb_file_per_table=ON (建议默认配置)
 
2、备份工具
 
mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备
 
cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份
 
LVM的快照:先加锁,做快照后解锁,几乎热备;借助文件系统管理工具进行备份
 
mysqlhotcopy:几乎冷备;(仅适用于MyISAM存储引擎)
 
 
1)mysqldump备份工具的使用
 
mysqldump是一个客户端命令,通过mysql协议连接至mysqld服务器进行备份:
 
mysqldump [OPTIONS] database [tables] 备份特定数据库的某张单表
mysqldump [OPTIONS] –B DB1 [DB2 DB3...] 备份指定的若干个数据库
mysqldump [OPTIONS] –A [OPTIONS] 备份所有数据库
 
 
 
2)mysqldump选项
 
-A, --all-databases 备份所有数据库,含create database
-B , --databases db_name… 指定备份的数据库,包括create database语句
-E, --events:备份相关的所有event scheduler
-R, --routines:备份所有存储过程和存储函数
--triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
--master-data[=#]: 此选项须启用二进制日志
1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
2:记录为注释的CHANGE MASTER TO语句
此选项会自动关闭--lock-tables功能,自动打开--lock-all-tables功能(除非开启--single-transaction)
 
-F, --flush-logs :备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志
文件,配合-A时,会导致刷新多次数据库,在同一时刻执行转储和日志刷新,则应同时使
用--flush-logs和-x,--master-data或-single-transaction,此时只刷新一次,建议:
和-x,--master-data或 --single-transaction一起使用
 
--compact 去掉注释,适合调试,生产不使用
-d, --no-data 只备份表结构
-t, --no-create-info 只备份数据,不备份create table
-n,--no-create-db 不备份create database,可被-A或-B覆盖
--flush-privileges 备份mysql或相关时需要使用
-f, --force 忽略SQL错误,继续执行
--hex-blob 使用十六进制符号转储二进制列(例如,“abc”变为0x616263),受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT
-q, --quick 不缓存查询,直接输出,加快备份速度
 
 
 
 
实验一 :冷备份数据库,并还原
 
思路:停服务,拷贝出数据库文件,进行冷备份
 
 
备份
 
1)查看当前的数据库,共有5个数据库
mysql -e 'show databases'

2)停服务
systemctl stop mariadb
 
 
3)备份文件:打包压缩拷贝出来 (对/var/lib/mysql整个文件夹,即所有数据全都备份)
tar Jcvf /data/all.tar.xz /var/lib/mysql/
 
注:1、生产环境应将备份文件与数据库服务器分开存放
2、将备份文件传输到非本 地服务器保存,以备还原时使用

4)模拟mysql数据库出现故障
 
rm -rf /var/lib/mysql/* (仅删除/var/lib/mysql/目录下的所有文件)
 
还原
 
 
5)用备份的文件读数据库进行还原
 
tar xvf /data/all.tar.xz
mv  var/lib/mysql/* /var/lib/mysql/
 
查看文件都已复原回去
 

6)重启服务
 
systemctl start mariadb
 
7)测试还原效果

实验三、基于LVM快照的备份(配合tar、cp等工具)
 
前提:
 
要实现基于LVM快照的备份,需要将数据库放到快照的空间,才能实现这种备份
 
1、将数据库数据迁移到逻辑卷
2、
 
 
备份
 
1)创建逻辑卷
 
fdisk /dev/sda
 
pvcreate /dev/sda6 创建pv
pvdisplay 确认
 
vgcreate vg0 dev/sda6 创建vg,将该pv加到vg中
vgdisplay 确认
 
lvcreate -L 5G -n lv_mysql vg0 创建lv.存放mysql数据
lvcreate -L 3G -n lv_binlog vg0 创建lv.存放二进制日志文件
lvs
 
mkfs.xfs /dev/vg0/lv_mysql 格式化文件系统
mkfs.xfs /dev/vg0/lv_binlog

mkdir /data/{mysql,binlog} 创建两个挂载点
 
mount /dev/vg0/lv_mysql /data/mysql/ 挂载
mount /dev/vg0/lv_binlog /data/binlog/
 
或需要永久挂载,修改/etc/fstab
 
vim /etc/fstab
添加两行
 
UUID=4615d276-95f9-4d03-a337-9438e9fb89d4 /data/mysql xfs default 0 0
UUID=9ab9b41f-1315-490a-b573-3144807f7313 /data/binlog xfs default 0 0
 
mount -a
 
 
2)修改目录权限
 
chown -R mysql: /data/mysql
chown -R mysql: /data/binlog

3)修改配置文件
 
按照规划将二进制日志和数据库文件分别存放于这两个目录
 
vim /etc/my.cnf

4)重启服务
 
systemctl restart mariadb
 
 
5)对数据库添加读锁,防止写入数据的操作
 
备份过程中暂停用户的读写,因此要先对数据库添加读锁,暂时禁止写的操作
 
MariaDB[(none)]> flush tables with read lock;
 
flush logs; 刷新日志,让生成新的日志
 
记录当前的二进制日志:mysql-bin.000004 245

注意:锁定,然后做快照再解锁,这个过程要快速,不能让用户一直不能访问,达到近乎热备的效果
 
6)对数据库中的某张表进行修改
 
MariaDB [(none)]> use hellodb;
MariaDB [hellodb]> show tables;

6)创建lvm快照(相当于对数据库做了备份)
 
lvcreate -L 1G -n lv_mysql_snap -s -p r /dev/vg0/lv_mysql
 
-s :快照
-p r:只读
 
 
7)对数据库解锁(恢复让用户正常访问)
 
MariaDB [(none)]> unlock tables; 解锁
 
测试下解锁后能否正常写入
create database dbx1;
show databases;

8)挂载逻辑卷快照
 
要导出快照里的备份,必须先能够访问快照的内容,因此对快照进行临时挂载
 
mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt

9)拷贝出逻辑卷快照里的文件,进行备份
 
cp -a /mnt/* /backup/

10)删除快照,否则影响用户访问数据库性能
 
umount /mnt 取消快照挂载
lvremove /dev/vg0/lv_mysql_snap 删除快照
 
再创建两个数据库,这是删除快照后创建的
 
MariaDB [(none)]> create database dbx2;
MariaDB [(none)]> create database dbx3;
 
 
模拟数据库损坏
 
  rm -rf /data/mysql/*
 
 
还原
 
1)停止服务
systemctl stop mariadb
 
 
2) 拷贝备份文件至数据目录
 
cp -av /backup/* /data/mysql/
 
3)启动服务
systemctl start mariadb
 
此时可看到,数据库还原至快照前状态

但是删除快照后创建的两个数据库dbx2,dbx3已经丢失了。
如果想恢复,可用二进制日志继续恢复:
 
5)添加读锁
 
flush tables with read lock; 添加读锁,暂时保持数据不能修改
 
(记录当前的二进制日志:mysql-bin.000004 245)
 
当前二进制已变为:mysql-bin.000005 | 245

6)将二进制日志导出,用以修复数据库
 
因为mysql-bin.000004 和mysql-bin.000005是快照之后,记录了最近发生的变化,因此将其导出,再利用它们修复数据库
 
cd /data/binlog (必须在此目录下)
 
mysqlbinlog --start-position=245 mysql-bin.000004 > /backup/bin.sql
mysqlbinlog mysql-bin.000005 >> /backup/bin.sql
 
 
7)确保恢复过程中,没有用户可以读取或写入
 
vim /etc/my.cnf
 
[mysqld]
skip_networking (禁止使用网络连接将使用户将无法连接数据库,只有自己可连)
iptables –A
 
重启mysql服务使生效
systemctl  restart mariadb
 
导入二进制文件
mysql < /backup/bin.sql
 
此时数据库已还原至最新状态

8)恢复用户访问数据库
 
vim /etc/my.cnf
 
[mysqld]
skip_networking              去掉
或清除防火墙
systemctl restart mariadb
 
至此,通过lvm快照方式的备份还原就完成了。

MySQL八、备份和还原的更多相关文章

  1. 转 MySQL 数据备份与还原

    MySQL 数据备份与还原 原贴:http://www.cnblogs.com/kissdodog/p/4174421.html   一.数据备份 1.使用mysqldump命令备份 mysqldum ...

  2. Linux下MySQL的备份与还原

    Linux下MySQL的备份与还原 1. 备份 [root@localhost ~]# cd /var/lib/mysql (进入到MySQL库目录,根据自己的MySQL的安装情况调整目录) [roo ...

  3. Mysql数据库备份和还原常用的命令

    Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下 ...

  4. [转]MySQL数据库备份和还原的常用命令小结

    MySQL数据库备份和还原的常用命令小结,学习mysql的朋友可以参考下: 备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword datab ...

  5. MySQL的备份和还原

    MySQL的备份和还原 备份:副本    RAID1,RAID10:保证硬件损坏而不会业务中止:        DROP TABLE mydb.tb1; 备份类型:        热备份.温备份和冷备 ...

  6. mysql数据备份和还原命令

    mysql数据库备份和还原   备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfil ...

  7. MySQL的备份与还原

    原文:MySQL的备份与还原 MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Win32下MySQL的备份与还原 1.1 备份 开始菜单 | 运行 | c ...

  8. MySQL的备份与还原以及常用数据库查看命令

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Serv ...

  9. mysql数据库备份与还原(转)

    MySQL备份和还原,都是利用mysqldump.mysql和source命令来完成的. 1.Linux下MySQL的备份与还原 1.1 备份 [root@localhost ~]# cd /var/ ...

  10. MySQL 数据备份与还原的示例代码

    MySQL 数据备份与还原的示例代码 这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 一.数据备份 1.使用 ...

随机推荐

  1. WebHttpRequest在sharepoint文档库中的使用

    写在前面 由于sharepoint服务器上的站点采用的域用户windows认证的方式登陆,而app项目虽然能够提供用户名和密码,但客户是不愿意在网络上这样传输的.所以给提供了使用ssl证书认证的方式. ...

  2. C语言数据结构基础学习笔记——栈和队列

    之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...

  3. 华硕R系列的解剖图

    1.键盘底部 2.右侧光驱,右下硬盘 3.电源 4.主板 5. 6.4G内存

  4. js获取浏览器内核判断终端(是QQ打开还是QQ浏览器打开)

    var browser ={ versions: function() { var u = navigator.userAgent, var ua = navigator.userAgent.toLo ...

  5. Linux 查看各文件夹大小命令du -h --max-depth=1

    du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...

  6. Django之form模板的使用

    form模块的简介与用处 1.form 是前后端交互的一种方式, form表单提交的一种,django中有一个模块是form他主要用处就过滤前端form提交的数据 1. forms 模块是处理前后台的 ...

  7. 解决PHP使用POST提交数据不完整,数据不全的问题

    在后台form中,通过ajax请求返回了一个有很多input的form表单,提交数据后,要格式化数组时发现提交过来的数据不完整. PHP从5.3.9开始 php.ini 增加一个变量 max_inpu ...

  8. 记号一下selenium+Firefox自动下载的参数

    参考: https://blog.csdn.net/wxstar8/article/details/80782556 https://blog.csdn.net/xiaoguanyusb/articl ...

  9. 在ASP.NET MVC中使用UEditor无法提交的解决办法

    很简单的一个ajax提交,却怎么都不成功 $.ajax({ type: "POST", url: "/mms/riskmanage/commitreply", ...

  10. Failed to connect to /127.0.0.1:8080

    参考 https://blog.csdn.net/qq_36523667/article/details/78823065 127.0.0.1为虚拟机的地址,需要将地址改为本机实际地址  ipconf ...