mysql数据备份

144 阅读3分钟

备份类型

  • 完全备份,部分备份

    完全备份:整个数据集

    部分备份:只备份数据子集,如部分库或表

  • 完全备份、增量备份、差异备份

  • 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂

    增量备份 还原规则就是 先备先还

image.png

######  常见备份命令介绍
备份命令备份速度恢复速度介绍功能一般用于
cp物理备份、灵活性低很弱少量数据备份
mysqldump逻辑备份、适用所有存储引擎一般中小型数据量备份
xtrabackup较快较快实现innodb热备、对存储引擎有要求强大较大规模的备份

image.png

mysqldump备份

-A, --all-databases 
#备份所有数据库,含create database
-B, --databases db_name…  
#指定备份的数据库,包括create database语句
-E, --events:
#备份相关的所有event scheduler
-R, --routines:
#备份所有存储过程和自定义函数
--triggers:
#备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
--default-character-set=utf8 
#指定字符集
-d, --no-data    
#只备份表结构,不备份数据,即只备份create table 
-t, --no-create-info 
#只备份数据,不备份表结构,即不备份create table 
-n,--no-create-db 
#不备份create database,可被-A或-B覆盖
--flush-privileges 
#备份mysql或相关时需要使用
-f, --force       
#忽略SQL错误,继续执行
--hex-blob        
#使用十六进制符号转储二进制列,当有包括BINARYVARBINARYBLOB,BIT的数据类型的列时使用,避免乱码
-q, --quick     
#不缓存查询,直接输出,加快备份速度

mysqldump 备份与恢复

mysqldump [OPTIONS] -B DB1 [DB2 DB3...]
#-B  可以选择多个数据库  可以备份数据库



mysqldump [OPTIONS] -A [OPTIONS]       
#备份所有数据库   也可以备份数据库

恢复例子:

mysqldump -uroot -pAdmin@123 -A -F --single-transaction --master-data=2 > /opt/all.sql

#备份 MySQL 服务器上的所有数据库

mysql -uroot -pAdmin@123 -e 'show databases;'
#-e  在linux中执行数据库

mysql -uroot -pAdmin@123 -e 'drop database hellodb;'
# 删库

mysql -uroot -pAdmin@123 <  /opt/all.sql

mysql -uroot -pAdmin@123 -e 'create database hellodb;'
mysql -uroot -pAdmin@123 hellodb <  /opt/all.sql
mysql -uroot -pAdmin@123 -e 'show tables from hellodb;'

备份恢复实战

假设每天2:30做完全备份,早上10:00误删除了表students,10:10才发现故障,现需要将数据库还原到10:10的状态,且恢复被删除的students表

开启二进制日志

vim /etc/my.cnf
log_bin=/data/mysql/mysql-bin
server-id = 100
mkdir /data
chown mysql.mysql /data/ -R
systemctl restart   mysqld

2.30执行全备份

mysqldump -uroot -pwzq314914 -A -F --single-transaction --master-data=2 > /opt/all.sql
# mysqldump 导出数据  
# -A  --all-databases的缩写 表示导出mysql上所有数据库
# -F --flush 缩写  导出之前刷新MySQL服务器的二进制日志
#--single-transaction 在一个单一的事务中导出表,用户要有足够权限启动事务  
#--master-data=2 导出时二进制文件的位置和文件名 =2 是包含 CHANGE MASTER TO 语句
# > /opt/all.sql 输出重定向 
 

数据更新后误删表

insert students (name,age,gender) values('rose',20,'f');
insert students (name,age,gender) values('jack',20,'f');

image.png 10:00 误删除了一个students的表

drop table students;

image.png

10点10分发现进行还原
grep '\-\- CHANGE MASTER TO'  /opt/all.sql 
搜索包含文本`-- CHANGE MASTER TO`的行
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=154;

使用 mysqlbinlog 工具来提取 MySQL 的二进制日志文件 /data/mysql/mysql-bin.000003 中从位置 154 开始的所有事件,并将这些事件输出到文件 /opt/inc.sql 中

mysqlbinlog --start-position=154 /data/mysql/mysql-bin.000003 > /opt/inc.sql

找到 之间删除的语句 并把这句删除

grep -i "^drop table"  /opt/inc.sql 

image.png

登录数据库还原 set sql_log_bin=0; 关闭二进制日志

先恢复 全备 此时表回来了 ,但是我们之后加的数据没回来

source     /opt/all.sql

image.png

source     /opt/inc.sql

image.png