十一、MySQL数据备份
数据备份
物理备份
-
物理备份
物理拷贝数据 cp -r /var/lib/mysql /mysql.bak tar -zcvf /root/mysql.tar.gz /var/lib/mysql/* 恢复方式(恢复前删除原有数据) cp -r 备份目录/mysql.bak /var/lib/mysql/ tar -xf /root/mysql.tar.gz -C /var/lib/mysql/ chown -R mysql:mysql /var/lib/mysql/ -
实验示例
这里实验就不做了 大概流程就是 - 打包A服务器原有数据 拷贝至另B服务器 - 停止B服务器MySQL服务,删掉/var/lib/mysql/下的目录 - 解压数据包到/var/lib/mysql/,并赋予权限 - 启动MySQL服务 进行验证
逻辑备份
-
什么是逻辑备份
使用软件自带备份程序(备份命令)对数据做备份,在执行备份命令时,会根据已有的数据生成对应的命令,吧命令存放到指定的备份文件里 恢复时,执行备份文件里的命令回复数据
数据备份策略
-
完全备份
备份所有数据(一张表,一个库,一台服务器) -
增量备份
只备份上次备份后,所有新产生的数据 # 在生产环境中,可能实行的策略是 周一完全备份,周二到周日进行差异备份 -
差异备份
备份上次"完全备份"后,所有新产生的数据 # 在生产环境中,可能实行的策略是 周一完全备份,周二到周日进行差异备份 # 记重点 "完全备份" 完全备份的时间是周一
数据备份操作
数据的完全备份与恢复
-
命令格式
# 备份命令格式 mysqldump -uroot -p密码 库名 > 目录/xxx.sql # 恢复命令格式 mysql -uroot -p密码 库名 < 目录/xxx.sql 备份时库名表示方式 - "--all-databases" 或 "-A" # 所有库 - 数据库名 # 单个库 (db2) - 数据库名 表名 # 单张表 (db2 user) - "-B 数据库1 数据库2" # 多个库 (-B db1 db2 db3) # 注意: - 无论备份还是恢复,都要验证用户权限!!! - 恢复一个库下的表的时候,需要指定库名(提前创建库),多个库操作时不需要创建(指定) - 恢复多个库或全局时,".sql"文件中有数据库创建切换语句,所以不需要指定 -
演示示例
[root@admin ~]# mysqldump -uroot -p'123456' --all-databases >/root/mybak/alldb.sql [root@admin ~]# mysqldump -uroot -p'123456' db2 user >/root/mybak/db2_user.sql [root@admin ~]# ls /root/mybak/ # 可以使用vim查看文件内容 将备份内容拷贝到node1主机上,进行数据恢复 [root@admin ~]# scp /root/mybak/db2_user.sql root@192.168.4.11:/root/ 恢复单个库的时候,需要在node1主机上的mysql库中创建db2库 mysql> create database db2; [root@node1 ~]# mysql -uroot -p'123456' db2 < /root/db2_user.sql # 数据恢复 恢复全部数据示例(多个库也是这样操作) [root@admin ~]# scp /root/mybak/alldb.sql root@192.168.4.11:/root/ [root@node1 ~]# mysql -uroot -p'123456' < /root/alldb.sql
Binlog日志(增量备份原理)
使用MySQL服务的binlog日志实现数据的增量备份与恢复
-
binlog日志的使用-
binlog日志介绍也叫作 二进制日志 MySQL服务日志的文件一种 记录除查询之外的所有SQL命令(只记录让数据发生改变的命令) 可用户数据备份和恢复 配置MySQL主从同步的必要条件 # 默认关闭,需要手动开启 -
启用
binlog日志server_id=数字 # 指定di值(1-255) log_bin[=目录/文件] # 启动binlog日志 max_binlog_size=数值m # 指定日志文件容量,默认1G [root@admin ~]# vim /etc/my.cnf [mysqld] server_id=50 log_bin [root@admin ~]# systemctl restart mysqld mysql> show master status; # 查看正在使用的binlog文件 # Position: 偏移量 只有修改数据内容偏移量才会发生变化,默认154 [root@admin ~]# ls /var/lib/mysql # 查看日志文件 admin-bin.000001 admin-bin.index # xx.index 是索引文件,记录日志文件位置,可以cat查看 # 修改binlog日志存放地址(注意不能放root目录下,mysql没有权限) [root@admin ~]# vim /etc/my.cnf [mysqld] server_id=50 log_bin=/mylog/plj # "plj" 指定生成文件的名称 [root@admin ~]# mkdir /mylog [root@admin ~]# chown mysql /mylog [root@admin ~]# ls -ld /mylog [root@admin ~]# systemctl restart mysqld [root@admin ~]# ls /mylog/ plj.000001 plj.index [root@admin ~]# mysql -uroot -p'123456' mysql> show master status; -
手动创建新的
binlog日志文件每次重启mysql服务,就会生成一个新的binlog文件 [root@admin ~]# systemctl restart mysqld (1) # 在交互模式下手动穿创建新的日志文件 mysql> flush logs; (2) # 在非交互模式下手动创建新的日志文件 [root@admin ~]# mysql -uroot -p'123456' -e "flush logs" (3) # 创建新的完全备份文件并创建新的日志文件 [root@admin ~]# mysqldump -uroot -p'123456' --flush-logs db2 > /root/mybak/db2.sql (4) # 每次创建新的日志文件可以查看mysql当前在使用哪个日志文件记录 [root@admin ~]# mysql -uroot -p'123456' -e "show master status" -
删除已有的日志文件
# 删除指定编号之前的binlog日志 purge master logs to "binlog文件名"; # 删除所有binlog日志,重建新日志 reset master;mysql> purge master logs to "plj.000003"; mysql> reset master; -
查看
binlog日志内容[root@admin ~]# mysqlbinlog /mylog/plj.000001 # 通过该方法查看binlog日志内容,发现看不懂,这时候我们需要修改binlog日志的格式修改日志格式
-
查看日志当前记录格式
mysql> show variables like "binlog_format"; # 三种记录模式 1. statement 报表模式 2. row 行模式 3. mixed 混合模式 -
修改日志记录格式
[root@admin ~]# vim /etc/my.cnf [mysqld] binlog_format="mixed" [root@admin ~]# systemctl restart mysqldmysql> reset master; # 重新记录日志文件之后插入几条数据再对binlog日志进行检索,发现已经可以看懂了 [root@admin ~]# mysqlbinlog /mylog/plj.000001 | grep "insert" insert into user(username) values('aier1') # 可以测试 插入 修改 和删除
-
-
-
使用
binlog日志恢复数据mysqlbinlog 目录/日志文件 | mysql -uroot -p'密码'# 将binlog日志拷贝要恢复的服务器(node1) ps:node1先删掉之前恢复的库 [root@admin ~]# scp /mylog/plj.000001 root@192.168.4.11:/root/ [root@node1 ~]# mysqlbinlog /root/plj.000001 | mysql -uroot -p'123456' -
使用
binlog日志恢复指定范围内的数据mysqlbinlog 选项 binlog日志文件 | mysql -uroot -p'密码' # 选项 起始时间 --start-datetime="yyyy-mm-dd hh:mm:ss" 结束时间 --stop-datetime="yyyy-mm-dd hh:mm:ss" 起始偏移量 --start-position=数字 结束偏移量 --stop-position=数字-
日志文件如何区分记录的多条SQL命令
偏移量 # Position --start-position=1054 --stop-position=2098 时间点 --start-datetime="yyyy-mm-dd hh:mm:ss" --stop-datetime="yyyy-mm-dd hh:mm:ss"
# 删除一张表记录 mysql> delete from db2.user where username="aier3"; [root@admin ~]# scp /mylog/plj.000001 root@192.168.4.11:/root/ # 关于日志文件偏移量的分析看视频吧,这里不好解释(这得靠眼睛分析 要命) [root@node1 ~]# mysqlbinlog --start-position=647 --stop-position=1253 /root/plj.000001 | mysql -uroot -p'123456' -

浙公网安备 33010602011771号