MySQL备份和恢复

目录

1.数据库备份的分类

[1.1 数据备份的重要性](#1.1 数据备份的重要性)

[1.2 数据库备份分类](#1.2 数据库备份分类)

[1.3 常见的备份方法](#1.3 常见的备份方法)

2.MySQL完全备份与恢复

[2.1 MySQL完全备份](#2.1 MySQL完全备份)

[2.2 数据库完全备份分类](#2.2 数据库完全备份分类)

[2.3 MySQL物理冷备份及恢复](#2.3 MySQL物理冷备份及恢复)

[2.4 数据迁移DST](#2.4 数据迁移DST)

[2.5 mysqldump进行逻辑备份](#2.5 mysqldump进行逻辑备份)

[2.5.1 mysqldump备份数据库](#2.5.1 mysqldump备份数据库)

[2.5.2 mysqldump备份数据表](#2.5.2 mysqldump备份数据表)

[2.6 数据库备份总结](#2.6 数据库备份总结)

[3. 恢复数据库](#3. 恢复数据库)

[3.1 使用source命令恢复数据库](#3.1 使用source命令恢复数据库)

[3.2 使用mysql命令恢复数据库](#3.2 使用mysql命令恢复数据库)

[3.2.1 重定向方式恢复数据库](#3.2.1 重定向方式恢复数据库)

[3.3 恢复表操作](#3.3 恢复表操作)

[3.4 完全恢复数据库总结](#3.4 完全恢复数据库总结)

4.MySQL增量备份与恢复

[4.1 二进制日志文件的内容](#4.1 二进制日志文件的内容)


1.数据库备份的分类

1.1 数据备份的重要性

1.2 数据库备份分类

数据库备份

物理备份:直接对数据库的物理文件(数据文件、日志文件等)进行备份
逻辑备份:对数据库对象(库、表)的数据以SQL语句的形式导出进行备份

备份策略

完全备份:每次备份都备份完整的库或表数据
差异备份:只备份上一次完全备份后的更新数据
增量备份:每次备份只备份上一次完全备份或增量备份后的更新数据

完全备份,差异备份,增量备份区别

备份工具

tar压缩打包(完全备份,物理冷备)
mysqldump(完全备份,逻辑热备)
mysqlhotcopy(完全备份,逻辑热备,仅支持MyISAM和ARCHIVE引擎表)
二进制日志(增量备份)
PXB XtraBackup innobackupex(完全备份、增量备份,物理热备)

1.3 常见的备份方法

物理冷备

先关闭数据库,使用 tar 命令压缩打包备份数据库的数据目录和文件 mysql/data/

专用备份工具mysqldump或mysqlhotcopy

  • mysqldump常用的逻辑备份工具

  • mysqlhotcopy仅拥有备份MylSAM和ARCHIVE表

启用二进制日志进行增量备份
第三方工具备份

PXB XtraBackup innobackupex(完全备份、增量备份,物理热备)

  • 进行增量备份,需要刷新二进制

2.MySQL完全备份与恢复

2.1 MySQL完全备份

2.2 数据库完全备份分类

物理冷备份与恢复

先关闭数据库,使用 tar 命令压缩打包备份数据库的数据目录和文件 mysql/data/

tar zcvf  归档文件  原数据文件/目录     gzip
tar  jcvf  归档文件  原数据文件/目录  bzip2
tar  Jcvf  归档文件  原数据文件/目录  xz

2.3 MySQL物理冷备份及恢复

物理冷备份

先关闭数据库,然后打包备份相关数据库文件;

prettyprint 复制代码
systemctl stop mysqld
mkdir /opt/backup    #将数据库备份文件保存到/opt/backup目录下
cd /usr/local/mysql
tar zcf /opt/backup/mysql_data-$(date +%F).tar.gz data/
cd /opt/backup/
tar tf mysql_data-2024-06-19.tar.gz    #查看tar压缩包里的数据文件
tar xf mysql_data-2024-06-19.tar.gz    #解压缩tar压缩包里的数据文件

恢复数据库

上面备份的数据库文件数据mysql_data-2024-06-19.tar.gz,作为远端异地已经备份好的数据库文件(IP:192.168.80.50),然后加载到另一台需要恢复的数据库主机(IP:192.168.80.15)。

###远端已备份数据文件主机(IP:192.168.80.50)
cd  /opt/backup
scp mysql_data-2024-06-19.tar.gz 192.168.80.50:/opt

###需要恢复数据库文件主机(IP:192.168.80.15)
systemctl stop mysqld
cd /opt
tar xf mysql_data-2024-06-19.tar.gz 
mv /usr/local/mysql/data /usr/local/mysql/data.bak    #将原有的数据库文件移走
mv /opt/data/ /usr/local/mysql/
systemctl restart mysqld   #重新启动数据库服务
mysql -uroot -pabc123    #此数据库密码为之前备份数据库的密码

2.4 数据迁移DST

DTS (Data Transmission Service,数据传输服务),用于在关系型数据库、NoSQL数据库、数据仓库之间迁移数据。可以使用DTS将数据迁移至阿里云,也可以在阿里云和本地数据系统之间做数据迁移

相比传统的数据传输工具,DTS的优势:

(1) 传输过程中保证高稳定性
(2) 支持多种数据传输方式,包括:数据迁移、数据集成、数据同步、数据订阅。
(3) 支持各种数据源直接的数据迁移。(如MySQL,redis等)
(4) 支持多种数据库引擎作为源和目标
(5) 支持断点续传:避免了硬件和网络故障导致的中断
(6) 支持定时任务

数据迁移总结:

体量小: 物理冷备 打包备份+恢复
体量中等: DTS
体量超大: 数据魔方

2.5 mysqldump进行逻辑备份

2.5.1 mysqldump备份数据库

###将数据库gzy的数据文件备份到/opt/backup目录下,并重命名为kx.sql
mysqldump -uroot -p1999 --databases mydb > /opt/backup/kx.sql  
vim /opt/backup//kx.sql 

###同时备份gzy和mysql两个数据库文件
mysqldump -uroot -p1999 --databases kx mysql > /opt/backup/mysql_kx.sql

备份所有数据库文件:
mysqldump -u用户名 -p密码 --all-databases > 指定路径的绝对路径/all.sql

###备份所有数据库中的数据库文件数据
mysqldump -uroot -p1999 --all-databases > /opt/backup/all-databases.sql

###过滤出备份文件中,不以"--"和"/*"开头,并且以"CREATE DATABASE"开头的数据行
cat all-databases.sql | grep -v "^--" | grep -v "^/\*" | grep "^CREATE DATABASE"

2.5.2 mysqldump备份数据表

备份指定数据库中的表数据文件:
mysqldump -u用户名 -p密码 数据库名 表名 > 指定路径的绝对路径/数据库名_表名.sql

###备份mydb数据库中kx表数据内容
mysqldump -uroot -p1999 mydb kx > /opt/backup/mydb_kx.sql
vim /opt/backup/mydb_kx.sql

备份指定数据库中的所有表数据文件:
mysqldump -u用户名 -p密码 数据库名 > 指定路径的绝对路径/数据库名_all.sql

###备份gzy数据库中的所有表数据内容,会包含mydb数据库中的所有表信息,但不包括创建数据库的操作
mysqldump -uroot -p1999 mydb > /opt/backup/kx_all.sql
vim /opt/backup/kx_all.sql

2.6 数据库备份总结

完全备份

物理冷备: 先关闭mysqld服务,使用tar命令打包备份数据库的数据目录/文件 /usr/local/mysql/data/

mysqldump、xtrabackup等工具来逻辑备份

###备份单库或多库
mysqldump -uXXX -pXXX --databases 库1 [库2] ... >  XXX.sql  
###备份所有的库   
mysqldump -uXXX -pXXX --all-databases > XXX.sql   
###备份库中的一个或多个表数据(不包含创建库的操作)             
mysqldump -uXXX -pXXX 库名 表1 表2 ... > XXX.sql   
###备份库中的所有表数据(不包含创建库的操作)            
mysqldump -uXXX -pXXX 库名 > XXX.sql                           

3. 恢复数据库

3.1 使用source命令恢复数据库

3.1 使用source命令恢复数据库的备份文件

使用source命令恢复数据库的备份文件

###查看mydb数据库中的kx表的数据文件信息(免交互登录数据库的方式)
mysql -uroot -p1999 -e "select * from mydb.kx;"   
###删除指定数据库mydb
mysql -uroot -p1999 -e "drop database kx;"

###登录数据库
mysql -uroot -p1999
###使用source命令恢复指定数据库文件
source /opt/backup/kx.sql;

注意: 在使用数据库备份文件恢复具体数据库时,可以直接使用source命令直接恢复数据库;但是在使用指定指定数据库中的数据表备份文件恢复数据时,需要先创建数据库,然后切换到新创建的数据库中,使用source命令恢复数据文件。

mysql -uroot -p1999 -e "drop database mydb;"

###登录数据库
mysql -uroot -p1999 
###先创建数据库kxxx,然后切换到新创建的数据库kxxx中
create database kxxx;
use kxxx;
###恢复数据库中的数据表文件数据
source /opt/backup/mydb_kx.sql;
select * from mydb;

3.2 使用mysql命令恢复数据库

3.2.1 重定向方式恢复数据库

使用mysql重定向的方式恢复指定数据库文件;

mysql -uroot -p1999 -e "drop database kx;"
###使用mysql重定向的方式恢复指定数据库文件
mysql -uroot -p1999 < /opt/backup/mydb_kx.sql
mysql -uroot -p1999 -e "show databases;"

免交互方式,使用指定数据库中的数据表文件恢复;

prettyprint 复制代码
mysql -uroot -p111 -e "drop database kx;"
mysql -uroot -p111 -e "show kx;"
mysql -uroot -p111 < /opt/backup/mydb_kx.sql
###将已备份好的数据文件恢复到指定数据库kx中
mysql -uroot -p111 kgc < /opt/backup/mydb_kx.sql
mysql -uroot -p111 -e "select * from mydb.kx;"

3.3 恢复表操作

用shell脚本自动执行备份操作

###每周二的凌晨十二点半,定时自动执行脚本备份所有的数据库文件数据
30  0  * * 2 xxx/mysqldump-uxx -pxxx --all-databases > /opt/backup/XXX.sql

3.4 完全恢复数据库总结

完全恢复

先登录到mysql,再执行 source XXX.sql(注:如果XXX.sql是表数据文件那么需要先自行创建库并use切换库)

mysql -uXXX -pXXX [库名] < XXX.sql
cat XXX.sql | mysql -uXXX -pXXX [库名]

4.MySQL增量备份与恢复

4.1 二进制日志文件的内容

mysql -uroot -p1999
###模糊查询通用日志的相关信息
show variables like 'general%';
###模糊查询二进制日志的相关信息
show variables like 'log_bin%';
###模糊查询慢查询日志的相关信息
show variables like '%slow%';
vim /etc/my.cnf
------------在"server-id"行下面添加mysql数据库的日志信息---------
server-id = 1
---------------------------------------------------------------
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2

systemctl restart mysqld
mysql -uroot -p1999

刷新生成二进制日志文件的两种方式:

(1)重启数据库服务:systemctl restart mysqld;

(2)flush-logs命令刷新:mysqladmin -uroot -p111 flush-logs;

注意: 新刷新出来的数据日志文件,实际是个空文件,因此应该备份保存的是新刷新出来的前一个序列号的日志文件。

二进制日志(binlog)有3种不同的记录格式:

STATEMENT(基于SQL语句):默认格式是STATEMENT。该方式记录语句快,占用内存空间少。但高并发情况下会导致记录日志顺序紊乱,造成恢复数据时发生偏差。
ROW(基于行):基于数据内容行进行记录,不仅记录执行的命令语句,还会记录命令影响的相关数据行。
MIXED(混合模式):高并发情况下ROW方式进行记录,一般情况下采用STATEMENT方式进行记录

vim /etc/my.cnf
#错误日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查询日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二进制日志
log-bin=mysql-bin
#可选,指定二进制日志(binlog)的记录格式为ROW
binlog_format = ROW
#慢查询日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2

systemctl restart mysqld
###转换格式,查看指定序列号的二进制数据日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001
--no-defaults:不使用默认格式进行查看
--base64-output=decode-rows:使用base64密码格式进行转换,-rows:按行进行输出
-v:显示详细输出过程
相关推荐
vvvae12347 小时前
分布式数据库
数据库
雪域迷影7 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹8 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人8 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky9 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa9 小时前
【MySQL 06】表的增删查改
数据库·mysql
向上的车轮9 小时前
Django学习笔记二:数据库操作详解
数据库·django
编程老船长10 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
全栈师10 小时前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle
Data 31710 小时前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop