物理冷备份时需要在数据库处于关闭状态下,能够较好地保证数据库的完整性。物理冷备份一般用于非核心业务,这类业务一般都允许中断,物理冷备份的特点就是速度快,恢复时也是最为简单的。通常通过直接打包数据库文件夹(本章中的数据库文件夹位于/usr/local/mysql/data)来实现备份。
mysqldump 是客户端常用逻辑备份程序,能够产生一组被执行以后再现原始数据库对象定义和表数据的SQL 语句。它可以转储一个到多个 MySQL 数据库,对其进行备份或传输到远程SQL 服务器。mysqldump 更为通用,因为它可以备份各种表。
mysqlhotcopy
是一个 Perl 脚本,主要用于对 MyISAM 表进行快速备份。它通过复制表文件的方式来实现备份,在备份时会对表进行锁定,以确保数据的一致性。语法:mysqlhotcopy [选项] 数据库名 [备份目录]
。如果不指定备份目录,则默认将备份文件存储在当前目录下。
MySQL 支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户 提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。
这是一款开源的、高性能的 MySQL 数据库备份工具,主要用于 InnoDB 和 XtraDB 存储引擎的热备份。它通过复制数据文件和日志文件,并在备份过程中应用事务日志,来确保备份数据的一致性。
mysql> create database db1; ##创建数据库
Query OK, 1 row affected (0.01 sec)
mysql> use db1;
Database changed
mysql> create table t1(user_name char(20),user_pass char(40)); ##创建表
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t1 values('zhangsan','123456'); ##准备要备份的数据
Query OK, 1 row affected (0.03 sec)
mysql> insert into t1 values('lisi','123456');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123456 |
| lisi | 123456 |
+-----------+-----------+
2 rows in set (0.00 sec)
[root@bogon ~]# systemctl stop mysqld ##因为做的是冷备份所以说需要关闭mysql数据库
[root@bogon ~]# mkdir -p /opt/backup ##创建目录用于存放备份的文件
[root@bogon ~]# cd /usr/local/mysql/
[root@bogon mysql]# ls
bin data docs include lib LICENSE man README share support-files
[root@bogon mysql]# tar zcvf back.tar.gz data ##将数据库文件data压缩为back.tar.gz
[root@bogon mysql]# mv back.tar.gz /opt/backup ##移动到backup目录中
[root@bogon mysql]# ls !$
ls /opt/backup
back.tar.gz
验证,模拟数据库故障
[root@bogon data]# cd /usr/local/mysql/data
[root@bogon data]# ls
auto.cnf ca.pem ibtmp1 performance_schema
binlog.000001 client-cert.pem '#innodb_redo' private_key.pem
binlog.000002 client-key.pem '#innodb_temp' public_key.pem
binlog.000003 error.log localhost.localdomain.pid server-cert.pem
binlog.000004 '#ib_16384_0.dblwr' mysql server-key.pem
binlog.index '#ib_16384_1.dblwr' mysql.ibd sys
bogon.pid ib_buffer_pool mysql.sock undo_001
ca-key.pem ibdata1 mysql.sock.lock undo_002
[root@bogon data]# rm -rf * ##将data目录中的数据删除,来模拟故障
[root@bogon backup]# cd data
[root@bogon data]# mv * /usr/local/mysql/data/ ##将备份号data文件重新复制过去
[root@bogon mysql]# systemctl start mysqld ##启动mysql数据库
mysql> show databases; ##进入到数据库查看数据
+--------------------+
| Database |
+--------------------+
| db1
语法:
mysqldump -u(指定用户) -p(指定密码) 库名 [表名1] 表名2] > /备份路径/备份文件名
mysql> create database mysqldb; ##创建数据库和表
Query OK, 1 row affected (0.01 sec)
mysql> use mysqldb;
Database changed
mysql> create table usert1(user_name char(20),user_pass char(40)); ##在表里面添加数据
Query OK, 0 rows affected (0.02 sec)
##将数据备份到/opt/backup中并重命名为mysqldb.sql
[root@bogon backup]# mysqldump -uroot -ppwd123 mysqldb usert1 > /opt/backup/mysqldb.sql
drop table usert1 ##备份完成后删除usert1表
[root@bogon backup]# mysql -uroot -ppwd123 mysqldb < mysqldb.sql ##将备份好的数据进行恢复
##查看数据的恢复情况
mysql> show tables;
+-------------------+
| Tables_in_mysqldb |
+-------------------+
| usert1 |
+-------------------+
1 row in set (0.00 sec)
mysql> desc usert1;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| user_name | char(20) | YES | | NULL | |
| user_pass | char(40) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
[root@bogon ~]# vim /etc/my.cnf ##在此文件中[mysqld]添加三行
log-bin=/usr/local/mysql/mysql-bin ##启用二进制日志
binlog_format=MIXED ##定义二进制日志的记录格式为混合模式
server-id=1 ##为mysql分配一个唯一的服务器标识符
[root@bogon ~]# systemctl restart mysqld ##重启mysqld服务
[root@bogon /]# cd /usr/local/mysql/ ##/usr/local/mysql/中会生成一个mysql-bin.000001的二进制文件
[root@bogon mysql]# ls
mysql-bin.000001
[root@bogon mysql]# mysqlbinlog mysql-bin.000001 ##使用此命令查看文件里面会又之前mysql数据库的命令
create database db1
create table t1(user_name char(20),user_pass char(40))
mysql> drop database db1; ##删除db1数据库
Query OK, 1 row affected (0.01 sec)
##使用命令恢复db1数据库
[root@bogon mysql]# mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -ppwd123
mysqladmin -uroot -ppwd123 flush-logs ##刷新日志会生成新的日志文件mysql-bin.000002
mysql> create database aaa; ##创建数据库
Query OK, 1 row affected (0.00 sec)
mysql> use aaa;
Database changed
mysql> create table bbb(user_name char(20),user_pass char(40));
Query OK, 0 rows affected (0.05 sec)
##往表里面添加数据
mysql> insert into bbb values('zhangsan','123'),('lisi','456'),('wangwu','789');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
+-----------+-----------+
3 rows in set (0.00 sec)
mysql> insert into bbb values('ccc','000'); ##单独插入一个用户方便验证
Query OK, 1 row affected (0.00 sec)
##刷新日志
[root@bogon mysql]# mysqladmin -uroot -ppwd123 flush-logs
BEGIN ##开始位置
/*!*/;
# at 1644
#250509 8:36:33 server id 1 end_log_pos 1754 CRC32 0x1919625c Query thread_i
SET TIMESTAMP=1746750993/*!*/;
insert into bbb values('ccc','000')
/*!*/;
# at 1754
#250509 8:36:33 server id 1 end_log_pos 1785 CRC32 0xb5f69b37 Xid = 74
COMMIT/*!*/; ##结束位置
Database changed
mysql> select * from bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
| ccc | 000 |
+-----------+-----------+
4 rows in set (0.00 sec)
mysql> delete from bbb where user_name="ccc"; ##删除ccc用户
Query OK, 1 row affected (0.00 sec)
mysql> select * from bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
+-----------+-----------+
3 rows in set (0.00 sec)
验证
##恢复指定位置的内容
[root@bogon mysql]# mysqlbinlog --no-defaults --start-position='1644' --stop-position='1754' mysql-bin.000002 | mysql -uroot -ppwd123
##查看恢复情况
mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
| ccc | 000 |
+-----------+-----------+
4 rows in set (0.00 sec)
mysql> insert into bbb values('ddd','999');
Query OK, 1 row affected (0.00 sec)
mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
| ccc | 000 |
| ddd | 999 |
+-----------+-----------+
5 rows in set (0.00 sec)
BEGIN
/*!*/;
# at 929
#250509 8:47:58 server id 1 end_log_pos 1039 CRC32 0xa963fcd4 Query thread_id=21 exec_time=0 error_code=0
SET TIMESTAMP=1746751678/*!*/;
insert into bbb values('ddd','999')
/*!*/;
# at 1039
#250509 8:47:58 server id 1 end_log_pos 1070 CRC32 0xe7b5c0fc Xid = 126
COMMIT/*!*/;
验证
mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
| ccc | 000 |
| ddd | 999 |
+-----------+-----------+
5 rows in set (0.00 sec)
mysql> delete from bbb where user_name="ddd"; ##删除ddd用户
Query OK, 1 row affected (0.01 sec)
mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
| ccc | 000 |
+-----------+-----------+
4 rows in set (0.00 sec)
##基于时间恢复
[root@bogon mysql]# mysqlbinlog --no-defaults --start-datetime='2025-05-09 8:47:58' --stop-datetime='2025-05-09 8:47:58' mysql-bin.000003 | mysql -uroot -ppwd123
mysql> select * from aaa.bbb;
+-----------+-----------+
| user_name | user_pass |
+-----------+-----------+
| zhangsan | 123 |
| lisi | 456 |
| wangwu | 789 |
| ccc | 000 |
| ddd | 999 |
+-----------+-----------+
5 rows in set (0.00 sec)