物理备份 ,
冷备 cp 、tar
首先需要两台PC: mysql 121.40.25.207
mysql02 47.98.104.114
( mysql 主机有mysql服务,且已有库表等数据,mysql02 为全新的主机。)
1、mysql主机操作步骤:
查看数据库目录:
ls /var/lib/mysql
拷贝数据库目录:
cp -r /var/lib/mysql /root/mysql.bak
查看备份的数据库目录:
ls /root/mysql.bak
压缩数据库目录进行备份:
tar -zcf /root/mysql.tar.gz /var/lib/mysql/*
查看备份的数据库目录压缩包:
ls /root
将主机1 的数据库目录传至主机2上:
scp -r /root/mysql.bak root@47.98.104.114:/opt/
2、mysql02主机操作步骤:
查看MySQL数据库端口是否启动:
netstat -lntup | grep 3306
如果在运行中,需先暂停数据库服务:
systemctl stop mysqld
删除数据库服务:
rm -rf /var/lib/mysql
将SCP过来的数据拷贝至/var/lib/mysql路径下:
cp -r /opt/mysql.bak/ /var/lib/mysql
查看拷贝后的目录:
ls -l /var/lib/mysql
更改属主属组,将root改为mysql:
chown -R mysql:mysql /var/lib/mysql
再次查看,主要确认更改后的属主属组是否正确:
ls -l /var/lib/mysql
查看MySQL数据库端口是否启动:(此时应该已启动)
netstat -lntup | grep 3306
登录数据库:
mysql -uroot -p
(此时加载的是主机mysql拷贝过来的授权库,则主机mysql管理员信息就记录在主机mysql的数据库中mysql库中的user表里, 所以此时密码应该输入的是主机mysql管理员的密码进行登录)
查看数据库所有库,发现与主机mysql的数据是一致的:
show databases;
热备 Xtrabackup
使用这个工具可以实现物理全备及 增量备份.
逻辑备份 mysqldump
中小企业全量备份策略的首选,备份策略一般是每日进行全量备份,备份会选择在流量低谷时执行,备份时可以选择锁表或者采用事务方式备份。
使用软件自带的备份程序(备份命令)对数据做备份,在执行备份命令时,会根据已有的数据生成对应的命令,把命令存放到指定的备份文件里。恢复时,执行备份文件里的命令恢复数据。
数据备份策略:
完全备份 : 备份所有数据
增量备份 : 备份上次备份后,所有新产生的数据
差异备份 : 备份完全备份后,所有新产生的数据
1、全量备份:
备份的格式:mysqldump -uroot -p 密码 库名 > 目录/xxx.sql
备份单个库:
数据库名
备份所有库:
-all-databases 或 -a
备份单张表:
数据库名 表名
备份多个库:
-b 数据库1 数据库2
恢复的格式: mysql -uroot -p 密码 库名 < 目录/xxx.sql
例如:
首先建立一个目录用来存放备份数据:
mkdir /mybak
其次,进行复制:
mysqldump -uroot -p'admin@123' -A >/mybak/alldb.sql
mysqldump -uroot -p'admin@123' l1 >/mybak/l1.sql
mysqldump -uroot -p'admin@123' l1 t2 >/mybak/l1_t2.sql
mysqldump -uroot -p'admin@123' -B l1 l2 >/mybak/twodb.sql
测试,删除数据库中的库表数据:
drop database l1;
drop database l2;
最后进行数据恢复:
mysql -uroot -p'admin@123' l1 </mybak/l1.sql
mysql -uroot -p'admin@123' l2 </mybak/l2.sql
恢复多个库时不需要提前创建相对应的库,备份文件中有建立库表的sql语句。
mysql -uroot -p'admin@123' </mybak/alldb.sql
2、 增量备份 binlog
使用binlog日志实现数据的增量备份与恢复
binlog日志:
也叫二进制日志,是mysql服务日志的一种,默认是没有开启的。
用于记录除查询之外的所有SQL命令
也可以用来数据备份与恢复
配置mysql主从同步的必要条件
启用binlog日志
vim /etc/my.cnf
[mysqld]
server_id=207
log_bin #默认在 /var/lib/mysql,默认命名主机名-bin。随机六位数
systemctl restart mysqld
#查看日志
mysql> show master status;
ls /var/lib/mysql
#创建自定义目录,这个目录需要提前建立好,并且mysql用户要对这个文件有写入权限
mkdir /mylog
#修改配置:
vim /etc/my.cnf
[mysqld]
server_id=207
log_bin=/mylog/ly
chown mysql /mylog
systemctl restart mysqld
#查看日志
mysql> show master status; #查看日志名称是否发生变化
日志名称发生了变化:之前:mysql-bin.000001
之后:ly.000001
每次重启服务,都会产生一个新的二进制文件。
刷新日志: flush logs;
查看日志:ls /mylog
删除已有的binlog日志:
清理日志:
删除指定编号之前的binlog日志文件
格式:purge master logs to “binlog文件名”;
purge master logs to "ly.000001";
删除所有的binlog日志,重建新日志
reset master;
此时,就会重头开始统计:
show master logs;
查看binlog日志的内容:
mysql> show master status;
+-----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------+----------+--------------+------------------+-------------------+
| ly.000001 | 154 | | | |
+-----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
添加数据:
insert into l1.t1 values("jim",26,"B180605","stu5@163.com");
insert into l1.t1 values("xiaoming",27,"B180606","stu6@163.com");
insert into l1.t1 values("xiaobai",23,"B180607","stu7@163.com");
再次查看binlog日志内容,发现偏移量发生改变。
mysql> show master status;
+-----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------+----------+--------------+------------------+-------------------+
| ly.000001 | 1012 | | | |
+-----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
查看binlog文件内容:
# mysqlbinlog /mylog/ly.000001
使用binlog日志恢复数据:
命令格式:
mysqlbinlog /路径/日志文件 | mysql -uroot -p'admin@123'
使用binlog日志恢复指定数据:
格式:
通过修改日志格式类型,可以看到sql语句,来决定那些需要备份,哪些不需要备份。
日志格式类型:
statement 报表模式
row 行模式
mixed 混合模式
查看行模式:mysql> show variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec)
修改日志记录格式:
vim /etc/my.cnf
[mysqld]
添加:
binlog_format=“mixed"
systemctl restart mysqld
清空日志:
reset master
登录数据库,查看binlog,插入数据,在日志文件中能看到刚写入的数据:
mysql> show master status;
+-----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------+----------+--------------+------------------+-------------------+
| ly.000001 | 154 | | | |
+-----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> insert into l1.t1 values("luo",28,"B180608","stu8@163.com");
Query OK, 1 row affected (0.01 sec)
mysql> show master status;
+-----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------+----------+--------------+------------------+-------------------+
| ly.000001 | 454 | | | |
+-----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> system mysqlbinlog /mylog/ly.000001 | grep -i insert
insert into l1.t1 values("luo",28,"B180608","stu8@163.com")
日志文件通过 偏移量、时间点 区分记录的多条命令
格式:
mysqlbinlog 选项 /路径/日志文件 | mysql -uroot -p 密码
指定偏移量:
–start-position=偏移量开始值 --stop-position=偏移量结束值
指定时间点:
–start-datetime=“yyyy-mm-dd hh:mm:ss” --stop-datetime=“yyyy-mm-dd hh:mm:ss”
例如:
删除刚才添加的那条数据:
mysql> delete from l1.t1 where name="luo";
Query OK, 1 row affected (0.01 sec)
查看命令是否写入成功:
# mysqlbinlog /mylog/ly.000001 | grep -i delete
delete from l1.t1 where name="luo"
日志文件传输,mysql主机拷贝至mysql02主机上:
# scp /mylog/ly.000001 root@47.98.104.114:/tmp
root@47.98.104.114's password:
ly.000001 100% 729 96.2KB/s 00:00
在mysql02主机上查看:
[root@mysql02 ~]# mysqlbinlog /tmp/ly.000001
展示执行sql的binlog信息,截取如下:
# at 454
#221027 18:17:33 server id 207 end_log_pos 519 CRC32 0x32cd22b1 GTID [commit=yes]
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 519
#221027 18:17:33 server id 207 end_log_pos 594 CRC32 0x10f9b1f4 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1666865853/*!*/;
BEGIN
/*!*/;
# at 594
#221027 18:17:33 server id 207 end_log_pos 698 CRC32 0x205df697 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1666865853/*!*/;
delete from l1.t1 where name="luo"
/*!*/;
# at 698
#221027 18:17:33 server id 207 end_log_pos 729 CRC32 0x576de941 Xid = 29
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
上述注释:# at 519 为开始偏移量
#221027 为系统时间
# at 698 为语句偏移量698
COMMIT 为提交
这里我们使用的是开始偏移量和语句提交后的偏移量(提交后语句才会生效)
总结:
物理备份与逻辑备份的区别: