备份数据库是常有的需求,通常是整库备份,整库还原。
但如果只想还原其中部分数据表,该怎么做呢?
测试前准备
- mysqldump 备份指定数据库,如:test_dump
1 | mysqldump -uroot -p mysql -F -R -E --triggers --databases test_dump | gzip >dbtest_$(date +%F).sql.gz; |
- 确认备份文件已经生成
1 | ll |
- 删除需要还原的表
查看当前数据库中所有表:
1 | mysql> show tables; |
查看需要还原的表的数据:
1 | mysql> select * from tb2; |
删除目标表:
1 | mysql> drop table tb2; |
从备份中恢复
- 从备份文件中找出需要恢复的表的建表语句:
1 | gunzip -c dbtest_2022-04-09.sql.gz | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `tb2`/!d;q'; |
- 从备份文件中找出需要恢复表的数据
1 | gunzip -c dbtest_2022-04-09.sql.gz | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `tb2`/!d;q' |
确认了数据之后无误之后,就开始恢复了。
- 恢复被删除表的表结构
1 | gunzip -c dbtest_2022-04-09.sql.gz | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `tb2`/!d;q' | mysql -uroot -p test_dump |
- 从备份文件中恢复被删除表的数据
1 | gunzip -c dbtest_2022-04-09.sql.gz | grep --ignore-case 'insert into `tb2`'| mysql -uroot -p test_dump |
查看目标表,数据已经恢复:
1 | mysql> select * from tb2; |
注意:实际使用时以上命令中的部分文件名或表名需要替换成你自己的。