对数据库操作系统的物理文件(如:数据文件、日志文件等)的备份
对数据库逻辑组件(如:表等数据库对象)的备份
物理冷备
备份时数据库处于关闭状态,直接打包数据库文件
备份速度快,恢复时也是最简单的
专用备份工具mysqldump或mysqlhotcopy
mysqldump常用的逻辑备份工具
mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表
启用二进制日志进行增量备份·
进行增量备份,需要刷新二进制日志
第三方工具备份
免费的MySQL热备份软件Percona XtraBackup
优点
备份与恢复操作简单方便
缺点
数据存在大量重复
占用大量备份空间
备份与恢复时间长
关闭MySQL数据库 > 使用tar命令直接打包数据库文件夹 > 直接替换现有MySQL目录
mysql1 :192.168.67.100
mysql2 :192.168.67.101
mysql -uroot -pabc123
#登录数据库
create datbbase scj;
#新建数据库
use scj;
#进入数据库
create table scj1 (id int, name varchar(10), age int, sex char(2), hobby varchar(50));
#新建表
show tables;
#查看数据库
#添加数据
insert into scj1 values (1, '张三', 22, '男', 'java');
insert into scj1 values (2, '李四', 23, '男', 'shell');
insert into scj1 values (3, '王五', 24, '男', '云计算');
insert into scj1 values (4, '赵四', 25, '男', 'url');
insert into scj1 values (5, '尼古拉斯', 26, '男', 'html');
insert into scj1 values (6, '日川钢板', 27, '男', 'css');
create table scj2 like scj1;
insert into scj2 (select * from scj1);
#克隆一个名为scj2的表
show tables from scj;
#查看是否创建成功
quit
#退出数据库
systemctl stop mysqld
#关闭数据库
cd /usr/local/mysql/data
#前往mysql默认日志目录下
mkdir /opt/backup
#创建备份日志文件目录
tar zcvf /opt/backup/mysql_full_$(date -d "-1 day" +%Y.%m.%d).tar.gz ./data/
#打包压缩上一天的data目录到/opt/backup目录下,并标上日期
#拓展
date +%Y/%m/%d
#只显示当前日期
date +%Y-%m01
#显示当月第一天
date -d "+1 day" +%Y/%m/%d
#显示明天
date -d "-1 day" +%Y/%m/%d
#显示昨天
或
date -d "1 day ago" +%Y/%m/%d
date -d "$(date +%Y%m01) -1 day" +%Y/%m/%d
#显示上月最后一天
date -d "(date -d "1 mouth" +%Y%m01) -1 day" +%Y/%m/%d
#显示当月最后一天
cd /opt
scp mysql_full_2023.09.18.tar.gz 192.168.67.101:/opt
#将打包的data目录远程拷贝到另一台mysql主机的opt目录下
#前往mysql2
systemctl stop mysqld
#关闭mysql服务
cd /usr/local/mysql
mv data/ data.bak
#将现data目录改名为data.bak
mv mysql_full_2023.09.18.tar.gz /usr/local/mysql/
#将此压缩包转移到mysql用户目录下
tar xf mysql_full_2023.09.18.tar.gz
#解压缩mysql1的data目录
systemctl start mysqld
#打开mysql服务
mysql -uroot -pabc123
#进入数据库
show databases;
#查看现有数据库
show tables from scj;
#查看库中现有数据库
select * from scj.scj1;
#查看表内容
#基本格式
mysqldump -u [用户名] -p[密码] --databases 库名1 [库名2] … > /备份路径/备份文件名.sql
#导出的就是数据库脚本文件
#完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -uXXX -p[XXX] 库名 > XXX.sql
#备份指定库中的所有表数据(不包含创建库的操作)
mysqldump -uroot -pabc123 scj > /opt/backup/scj.sql
#只备份表和表中的内容,并没有备份库
cd /opt/backup
ls
cat scj.sql |egrep -v "^--|^/\*|^$"
#过滤出需要的信息
mysqldump -uroot -pabc123 --databases scj > /opt/backup/scj_full.sql
#备份一个完整的库到/opt/backup目录下
cat scj_full.sql |egrep -v "^--|^/\*|^$"
#过滤出需要的信息
mysqldump -u [用户名] -p[密码] --all-databases > /备份路径/备份文件名.sql
mysqldump -u root -pabc123 --all-databases > /opt/all_full.sql
#完全备份 MySQL 服务器中所有的库
cat all_full.sql |grep "^CREATE DATABASE"
mysqldump -u root -p[密码] 库名 [表名1] [表名2] … > /备份路径/备份文件名.sql
#备份指定库中的一个或多个表数据(不包含创建库的操作)
mysqldump -u root -pabc123 scj scj2 > /opt/backup/scj_scj2.sql
#备份scj库中scj2表
cat scj_scj2.sql |egrep -v "^--|^/\*|^$"
#查看备份内容信息
#记得提前备份
#模拟环境
#先登录mysql
mysql -uroot -pabc123
mysql>drop databases scj;
#删除scj库
source /opt/backup/scj_full.sql
#恢复完整的scj库
#注:一定要用绝对路径
#也可以只用表数据进行恢复
create database scj;
#创建新scj库
use scj;
#进入scj库
source /opt/backup/scj.sql
#恢复库中表数据
#因为scj.sql中不包含有创建库的操作,所以可以在任意一个库中导入表数据
#基本格式
mysql -uXXX -pXXX [库名] < XXX.sql #如果sql文件只包含表的备份,要指定库名
或
cat XXX.sql | mysql -uXXX -pXXX [库名]
mysql -uroot -pabc123 scj < scj.sql
#需要提前创建库
mysql -uroot -pabc123 < scj_full.sql
#直接恢复完整的数据库
mysql -uroot -pabc123 -e "drop database scj;"
#-e 执行命令后退出数据库
mysql -uroot -pabc123 -e "show databases;"
#查看是否删除完成
mysql -uroot -pabc123 < scj_full.sql
mysql -uroot -pabc123 -e "show databases;"
#查看是否恢复完成
是自上一次备份后增加和变化的文件或内容
跳过某个发生错误的时间点实现数据恢复
vim /etc/my.cnf
#编辑配置文件
#添加
log-bin=mysql-bin
binlog_format = MIXED #可选,指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1
#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT
systemctl restart mysqld
#重新启动服务
ls /usr/local/mysql/data
#因为二进制文件内容默认是二进制字符,人是看不懂的
#所以使用mysqlbinlog命令
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001
#以base64方式进行解码,按行进行读取编码,显示详细内容,指定mysql-bin.000001文件
#除了可以用重启来刷新mysql二进制文件,还可以使用mysqladmin命令来刷新二进制文件
mysqladmin -uroot -pabc123 flush-logs
#再次生成新的二进制日志文件
cat mysql-bin.index
#该文件保存着所有的二进制文件的序列号
#模拟环境
select * from scj.scj1
#事先准备表
#当天二进制文件是没有操作数据的
cat /usr/local/mysql/data/mysql-bin.000003
#查看最新二进制日志文件
#首先实现完全备份
mkdir /opt/backup
cd /opt/backup
mkdir full bin
#full目录做完全备份,bin做增量备份
vim /opt/mysqlquan.sh
#编写完全备份脚本
#!/bin/bash
mysqldump -u root -p123456 --all-databases > /bak/all_$(date +%F).sql
chmod 700 /opt/mysqlquan.sh
#添加属主的权限
vim /opt/binlog.sh
#编写增量备份脚本
#!/bin/bash
filename=$(sed -n '$p' /usr/local/mysql/data/mysql-bin.index | awk -F '/' '{print $2}')
#使用sed命令打印二进制日志文件最后一行内容作为filename变量的值
mv /usr/local/mysql/data/$filename /bak/binlog_$(date +%F)
#将二进制日志移动到备份目录下,并将移动后的文件名称加上日期
mysqladmin -uroot -pabc123 flush-logs
#生成新的二进制日志文件
chmod 700 /opt/binlog.sh
#添加属主的权限
crontab -e
#做计划任务
mysqldump -uroot -pabc123 scj scj1 > /opt/backup/full/scj_scj1-$(date +%Y.%m.%d).sql
#将scj库下scj1表备份到/opt/backup/full下
mysqladmin -uroot -pabc123 flush-logs
#重新生成一个二进制文件
#进入数据库
#插入两条数据
insert into scj.scj1 values (7, '小黑子', 25, '男', '黑坤坤');
insert into scj.scj1 values (8, '小仙女', 18, '女', '打拳');
select * from scj.scj1;
#查看内容
mysqladmin -uroot -pabc123 flush-logs
#保存上一个文件并生成新一个文件
mv -f mysql-bin.000004 /opt/backup/bin/mysql-bin.000004-$(date -d '1 day' +_%Y.%m.%d)
#进入数据库
#插入两条数据
insert into scj.scj1 values (9, 'giao桑', 28, '男', 'giao');
insert into scj.scj1 values (10, '翠花', 18, '女', '看打拳');
select * from scj.scj1;
#查看内容
mysqladmin -uroot -pabc123 flush-logs
#保存上一个文件并生成新一个文件
mv -f mysql-bin.000005 /opt/backup/bin/mysql-bin.000005-$(date -d '1 day' +_%Y.%m.%d)
#进入数据库
#模拟被删库跑路了
drop databbase scj;
#现在进行恢复
create database scj;
#新建库
mysql -uroot -pabc123 scj < /opt/backup/full/scj_scj1-2023.09.20.sql
#首先恢复基础表数据
#进入数据库
select * from scj.scj1
#查看表内容
#恢复第二次输入的内容
mysqlbinlog --no-defaults /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#进入数据库
select * from scj.scj1
#查看表内容
#恢复第三次输入的内容
mysqlbinlog --no-defaults /opt/backup/bin/mysql-bin.000005-_2023.09.22 | mysql -uroot -pabc123
#将二进制文件转译
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004-_20230921 > mysql-bin-2023.09.21
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000005-_2023.09.22 > mysql-bin-2023.09.22
#基本格式
mysqlbinlog --no-defaults --start-position='位置点' --stop-position='位置点' 二进制日志文件 | mysql -uXXX -pXXX
#示例
#只恢复小黑子那一段
#进入数据库清空表数据
truncate table scj.scj1;
vim /opt/backup/bin/vim mysql-bin-2023.09.21
#查看具体位置点
mysqlbinlog --no-defaults --start-position='293' --stop-position='526' /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#将具体的位置点传往数据库服务器
#注:要使用二进制文件,不要用编码后的二进制文件
#前往数据库
select * from scj.scj1;
#查看内容
#基本格式
mysqlbinlog --no-defaults --start-datetime='YYYY-mm-dd HH:MM:SS' --stop-datetime='YYYY-mm-dd HH:MM:SS' 二进制日志文件 | mysql -uXXX -pXXX
#示例
#只恢复小仙女那一段
#进入数据库清空表数据
truncate table scj.scj1;
vim /opt/backup/bin/vim mysql-bin-2023.09.21
#查看具体时间点
mysqlbinlog --no-defaults --start-datetime='2023-09-20 0:37:43' --stop-datetime='2023-09-20 0:40:35' /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#将具体时间点范围内的数据传往数据库服务器内
#前往数据库
select * from scj.scj1;
#查看内容