26人参与 • 2026-04-28 • Mysql
从物理与逻辑的角度,备份可分为
物理备份方法
从数据库的备份策略角度,备份可分为
物理冷备
专用备份工具mydump或mysqlhotcopy
启用二进制日志进行增量备份:进行增量备份,需要刷新二进制日志
第三方工具备份:免费的mysql热备份软件percona xtrabackup
优点
缺点
物理冷备份与恢复
mysqldump备份与恢复
物理冷备份
[root@localhost mysql]# systemctl stop mysqld.service [root@localhost ~]# cd /usr/local/mysql/ [root@localhost mysql]# tar zcvf /opt/mysql_all-$(date +%f).tar.gz data/ [root@localhost mysql]# cd /opt [root@localhost opt]# ls mysql_all-2020-08-18.tar.gz
恢复数据库
[root@localhost opt]# cd /usr/local/mysql/ [root@localhost mysql]# rm -rf data/ '删除数据库文件' [root@localhost mysql]# mysql -uroot -p mysql> show databases; '此时数据库文件消失' +--------------------+ | database | +--------------------+ | information_schema | +--------------------+ 1 row in set (0.00 sec) [root@localhost mysql]# cd /opt [root@localhost opt]# tar zxvf mysql_all-2020-08-18.tar.gz -c /usr/local/mysql/ '将备份的文件恢复' [root@localhost mysql]# systemctl start mysqld.service [root@localhost mysql]# mysql -uroot -p mysql> show databases; '数据恢复' +--------------------+ | database | +--------------------+ | information_schema | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)
mysql> show databases; +--------------------+ | database | +--------------------+ | information_schema | | apple | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> use mydatabase; database changed mysql> show tables; +----------------------+ | tables_in_mydatabase | +----------------------+ | mytable | +----------------------+ 1 row in set (0.00 sec) mysql> select * from mytable; +----+----------+-------+---------+ | id | name | score | address | +----+----------+-------+---------+ | 1 | zhangsan | 80.00 | sh | | 2 | lisi | 77.00 | nj | +----+----------+-------+---------+ 2 rows in set (0.00 sec)
mysqldump命令对单个库进行完全备份
mysqldump -u用户名-p [密码] [选项] [数据库名] > /备份路径/备份文件名
[root@localhost ~]# mysqldump -uroot -p123456 mydatabase > /opt/mydatabase.sql mysqldump: [warning] using a password on the command line interface can be insecure. [root@localhost opt]# ls mydatabase.sql
mysqldump命令对多个库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --databases 库名1 [库名2] ... > /备份路径/备份文件名
[root@localhost ~]# mysqldump -uroot -p123456 --databases mydatabase apple > /opt/mydatabase-apple.sql mysqldump: [warning] using a password on the command line interface can be insecure. [root@localhost opt]# ls mydatabase-apple.sql mydatabase.sql
对所有库进行完全备份
mysqldump -u 用户名 -p [密码] [选项] --all-databases > /备份路径/备份文件名
[root@localhost ~]# mysqldump -uroot -p123456 --all-databases > /opt/all.sql mysqldump: [warning] using a password on the command line interface can be insecure. [root@localhost opt]# ls all.sql mydatabase-apple.sql mydatabase.sql
mysqldump可针对库内特定的表进行备份
mysqldump -u 用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
[root@localhost opt]# mysqldump -uroot -p123456 mydatabase mytable > /opt/mydatabase.mytable.sql mysqldump: [warning] using a password on the command line interface can be insecure. [root@localhost opt]# ls all.sql mydatabase.sql mydatabase-apple.sql mydatabase.mytable.sql
使用mysqldump导出的脚本,可使用导入的方法
使用source恢复数据库的步骤
source恢复的示例
mysql > source /backup/all-data.sql
mysql> drop table mytable; query ok, 0 rows affected (0.00 sec) mysql> show tables; empty set (0.00 sec) mysql> source /opt/mydatabase.sql mysql> show tables; +----------------------+ | tables_in_mydatabase | +----------------------+ | mytable | +----------------------+ 1 row in set (0.00 sec)
mysql> drop database apple; query ok, 1 row affected (0.00 sec) mysql> drop database mydatabase; query ok, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> source /opt/mydatabase-apple.sql mysql> show databases; +--------------------+ | database | +--------------------+ | information_schema | | apple | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)
使用mysql命令恢复数据库
mysql -u 用户名 -p 密码 < 库备份脚本的路径
例:
[root@localhost opt]# mysql -uroot -p123456 < /opt/mydatabase-apple.sql
恢复表的操作
mysql -u 用户名 -p 密码 < 表备份脚本的路径
[root@localhost opt]# mysql -uroot -p123456 < /opt/mydatabase.info.sql
在生产环境中,可以使用shell脚本自动实现定时备份
使用mysqldump进行完全备份存在的问题
是自上一次备份后增加/变化的文件或者内容
特点
mysql没有提供直接的增量备份方法
可通过mysql提供的二进制日志间接实现增量备份
mysql二进制日志对备份的意义
[root@localhost opt]# vim /etc/my.cnf ....... [mysqld] user = mysql basedir = /usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock log-bin=mysql-bin '添加以mysql-bin为开头的二进制文件' server-id = 1 [root@localhost data]# ls apple ibdata1 ibtmp1 mysql-bin.000001 '二进制日志文件' auto.cnf ib_logfile0 mydatabase mysql-bin.index ib_buffer_pool ib_logfile1 mysql
一般恢复:将所有备份的二进制日志内容全部恢复
mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p
基于位置恢复
恢复数据到指定位置 mysqlbinlog --stop-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码 从指定的位置开始恢复数据 mysqlbinlog --start-position='操作id' 二进制日志 |mysql -u 用户名 -p 密码
基于时间点恢复
跳过某个发生错误的时间点实现数据恢复
从日志开头截止到某个时间点的恢复 mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码 从某个时间点到日志结尾的恢复 mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码 从某个时间点到某个时间点的恢复 mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 |mysql -u 用户名 -p 密码
操作前先进行完整备份
[root@localhost ~]# mysqldump -uroot -p123456 mydatabase mytable > /opt/mytable.sql
开启日志文件
[root@localhost ~]# vim /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock log-bin=mysql-bin '开启二进制日志文件' [root@localhost data]# systemctl restart mysqld.service [root@localhost data]# ls apple ibdata1 ibtmp1 mysql-bin.000001 '二进制日志文件' auto.cnf ib_logfile0 mydatabase mysql-bin.index ib_buffer_pool ib_logfile1 mysql
进行模拟误操作
mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | +----+----------+-----+ 3 rows in set (0.00 sec) mysql> insert into mytable values (4,'zhaoliu','20'); '执行正确操作' query ok, 1 row affected (0.02 sec) mysql> delete from mytable where id=1; '进行误操作' query ok, 1 row affected (0.00 sec) mysql> insert into mytable values (5,'qiqi','21'); '执行正确操作' query ok, 1 row affected (0.01 sec) mysql> select * from mytable; +----+---------+-----+ | id | name | age | +----+---------+-----+ | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | | 5 | qiqi | 21 | +----+---------+-----+ 4 rows in set (0.00 sec)
进行增量备份
[root@localhost data]# mysqladmin -uroot -p123456 flush-logs mysqladmin: [warning] using a password on the command line interface can be insecure.
解码二进制日志文件
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 > /opt/bk01.txt
[root@localhost data]# vim /opt/bk01.txt # at 584 '正常操作结束' #200822 15:06:12 server id 1 end_log_pos 646 crc32 0x591ad99d table_map: `mydatabase`.`mytable` mapped to number 108 # at 646 '执行的误操作' #200822 15:06:12 server id 1 end_log_pos 698 crc32 0x4ddb56be delete_rows: table id 108 flags: stmt_end_f ### delete from `mydatabase`.`mytable` ### where ### @1=1 ### @2='zhangsan' ### @3='22' # at 698 '正常操作开始' #200822 15:06:12 server id 1 end_log_pos 729 crc32 0x30b1bed7 xid = 7 commit/*!*/; #200822 15:06:30 server id 1 end_log_pos 794 crc32 0x576f94b9 anonymous_gtid last_committed=2 sequence_number=3 set @@session.gtid_next= 'anonymous'/*!*/;
先删除错误的数据表,进行恢复
mysql> drop table mytable; query ok, 0 rows affected (0.00 sec) mysql> source /opt/mytable.sql; mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | +----+----------+-----+ 3 rows in set (0.00 sec)
使用增量备份的断点恢复
[root@localhost data]# mysqlbinlog --no-defaults --stop-position='584' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [warning] using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | +----+----------+-----+ 4 rows in set (0.00 sec) [root@localhost data]# mysqlbinlog --no-defaults --start-position='698' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [warning] using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | | 5 | qiqi | 21 | +----+----------+-----+ 5 rows in set (0.00 sec)
按照增量备份中的时间点恢复
mysql> drop table mytable; query ok, 0 rows affected (0.00 sec) mysql> source /opt/mytable.sql; mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | +----+----------+-----+ 3 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='2020-8-22 15:06:12' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [warning] using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | +----+----------+-----+ 4 rows in set (0.00 sec) [root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2020-8-22 15:06:30' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [warning] using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | | 5 | qiqi | 21 | +----+----------+-----+ 5 rows in set (0.00 sec)
以上就是mysql中数据库备份恢复的常用方法详解的详细内容,更多关于mysql数据库备份恢复的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论