备份:能防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在其他地方。
冗余:数据有多分冗余,但不等备份,只能防止机械故障带来得数据丢失,例如主备模式、数据库集群。
所有备份数据都应放在非数据库本地,而且建议由多份副本。
在测试环境中做日常恢复演练(备份恢复更为重要)
tar,cp,scp
直接复制数据库文件,适用于大型数据库环境,不受储存引擎 的限制,但不能恢复到不同的mysql版本。
优点:快
缺点:服务停止
mysqldump , mydumper
备份的是建表,建库,插入等操作所执行的sql语句(DDL DML DCL),适用于中小型数据库。
缺点是效率相对较低
连续恢复
每次仅备份上次备份的文件,备份体积小,速度快,但是恢复的时候需要按备份时间顺序,逐个备份版本进行恢复,恢复时间长。
跳跃恢复
占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。
物理备份数据库,备份期间,服务不可用
systemctl stop mysqld
mkdir /backup
tar -cf /backup/`date +%F`-mysql-all.tar /var/lib/mysql
注:备份文件应复制到其他服务器或存储上
systemctl start mysqld
systemctl stop mysqld
2.清理环境(模拟损坏)
注:生产环境中不要作死
rm -rf /var/lib/mysql/*
3.导入备份数据
tar -xf /backup/2058-01-01-mysql-all.tar -C /
systemctl start mysqld
lvm快照实现物理备份 + binlog(物理备份)数据一致,服务可用
MySQL数据lv 和 将要创建的snapshot 必须在同一VG,因此VG必须要有一定的剩于空间
mysql运行一段时间,数据并没有存储lvm,将现在的数据迁移到lvm
# lvcreate -n lv-mysql -L 2G datavg
# mkfs.xfs /dev/datavg/lv-mysql
# systemctl stop mysqld
# mount /dev/datavg/lv-mysql /mnt/ //临时挂载点
# cp -a /var/lib/mysql/* /mnt //将MySQL原数据镜像到临时挂载点
# umount /mnt/
# vim /etc/fstab //加入fstab开机挂载
/dev/datavg/lv-mysql /var/lib/mysql xfs defaults 0 0
# mount -a
# chown -R mysql.mysql /var/lib/mysql
# systemctl start mysqld
mysql> flush tables with read lock;
# lvcreate -L 500M -s -n lv-mysql-snap /dev/datavg/lv-mysql
# mysql -p'密码' -e 'show master status' > /backup/`date +%F`_position.txt
mysql> unlock tables;
# mount -o ro /dev/datavg/lv-mysql-snap /mnt/
# cd /mnt/
# tar -cf /backup/`date +%F`-mysql-all.tar ./*
# cd; umount /mnt/
# lvremove -f /dev/datavg/lv-mysql-snap
# systemctl stop mysqld
# rm -rf /var/lib/mysql/*
# tar -xf /backup/2028-01-01-mysql-all.tar -C /var/lib/mysql/
# chown -R mysqlmysql /var/lib/mysql/
# systemctl start mysqld
1、flush table with read lock; 全局读锁
2、create snapshot 创建快照
3、show master status; show slave status; [可选]
查询二进制日志的位置,下次使用bin 作为依据。
4、unlock tables; 释放锁
5、Copy files from the snapshot 从快照卷,复制数据。
6、Unmount the snapshot. 卸载并删除快照。
7、Remove snapshot
#!/bin/bash
#LVM backmysql...
back_dir=/backup/`date +%F`
[ -d $back_dir ] || mkdir -p $back_dir
echo "FLUSH TABLES WITH READ LOCK; SYSTEM lvcreate -L 500M -s -n lv-mysql-snap /dev/datavg/lv-mysql; \
UNLOCK TABLES;" | mysql -p'密码'
mount -o ro,nouuid /dev/datavg/lv-mysql-snap /mnt/
rsync -a /mnt/ $back_dir
if [ $? -eq 0 ];then
umount /mnt/
lvremove -f /dev/datavg/lv-mysql-snap
fi
crontab -e
0 2 * * * /root/mysql.sh
它是开源免费的支持MySQL 数据库热备份的软件,它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份。它不暂停服务创建Innodb热备份;
为mysql做增量备份;在mysql服务器之间做在线表迁移;使创建replication更加容易;备份mysql而不增加服务器的负载。
使用略
使用mysqldump实现逻辑完全备份 + binlog
mysqldump -h 服务器 -u 用户名 -p密码 数据库名 >备份文件.sql
-A, --all-databases 所有库
database 数据库名
database stu_info t1 是指database数据库的表stu_info、t1
-B, --databases bbs test mysql 多个数据库
-F, --flush-logs 备份之前刷新binlog日志(截断日志。备份之后新binlog。)
--master-data=1|2
该选项将会记录备份时binlog的日志位置与文件名并追加到文件中,内容如下:
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000016',
MASTER_LOG_POS=107;
表示备份的是日志文件16里位置为107之前的数据
--quick,-q
该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--no-data,-d
不导出任何数据,只导出数据库表结构。
-x, --lock-all-tables
在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭
--lock-tables
它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表
-R, --routines 备份存储过程和存储函数
--triggers 备份触发器
mysqldump --help
1.备份库
# mysqldump -uroot -p'密码' -A >all.sql
2.备份二进制日志文件
# cp /var/lib/mysql/*bin*-
恢复流程:
1. 停止数据库
2. 清理环境
3. 启动数据库 【初始密码 /var/log/mysqld.log】
4. 重置密码 【新密码 】
5. mysql恢复数据 【新密码 】
6. 刷新授权 【备份时密码 】
mysql -p'密码' < /backup/2028-01-01-01-mysql-all.sql
1.观察二进制截取记录
vim /backup/2028-01-01-01-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000002', MASTER_LOG_POS=154;
注意后续有多少日志,要跟多少日志名字。
2.恢复
mysqlbinlog localhost-bin.000002 localhost-bin.000003 --start-position=154 | mysql -p'密码'
#!/bin/bash
fullday=`date +%w`
backfile=`find /var/lib/mysql/ -name mylog.00* | head -1`
if [ $fullday -eq 0 ]
then
mysqldump -A > /mysql_backup/full_`date +%Y%m%d%H%M`.sql
else
if [ -z $backfile ]
then
echo 'file not found,create new binlog!'
mysqladmin flush-logs
else
mysqladmin flush-logs
tar cvzf /mysql_backup/`date +%Y%m%d%H%M`.tar.gz $backfile
rm -rf $backfile
fi
fi
select * from db1.t1 into outfile '/backup/t1.txt'
# mysql -uroot -p'password' -e 'select * from db1.t1' > /backup/testdb1.t2.txt
# mysql -u root -p'password' --xml -e 'select * from db1.t1' > /backup/testdb1.t3.txt
# mysql -u root -p'password' --html -e 'select * from db1.t1' > /backup/index.html
vim /etc/my.cnf
secure-file-priv=/backup mysql不信任该目录
chown mysql.mysql /backup mysql用户没有权限
标的导入和导出只会备份表记录,不会备份表结构,因此需要mysqldump备份表结构,恢复时先恢复表结构,再导入数据。
load data infile '/backup/db1.t1.txt' into table db1.t1;
#读取备份文件
into table db1.t1
#输入表中
select * from db1.t1