mysql数据库的备份与恢复
这里准备的是8.0版本的MySQL数据库。
一,前景准备
1、安装MySQL数据库用以测试
这里准备的是8.0版本的MySQL数据库
下载地址:MySQL :: Download MySQL Community Server (Archived Versions)
为了方便实验,执行脚本进行安装:
# /bin/bash
#
# 官方下载地址: https://downloads.mysql.com/archives/community/
SRC_DIR=`pwd`
#MYSQL='mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz'
URL=http://mirrors.163.com/mysql/Downloads/MySQL-5.7
MYSQL='mysql-8.0.29-linux-glibc2.12-x86_64.tar.xz'
#URL=http://mirrors.163.com/mysql/Downloads/MySQL-8.0
COLOR='echo -e \E[01;31m'
END='\E[0m'
MYSQL_ROOT_PASSWORD=123456
check(){
if [ $UID -ne 0 ];then
echo "当前用户非root,安装失败" false
exit 1
fi
cd $SRC_DIR
yum -y -q install wget libaio numactl-libs ncurses*
#wget $URL/$MYSQL
if [ ! -e $MYSQL ];then
$COLOR"缺少${MYSQL}文件"$END
$COLOR"请将相关的软件放在${SRC_DIR}目录下"$END
exit
elif [ -e /usr/local/mysql ];then
echo "数据库已存在,安装失败" false
exit
else
return
fi
}
install_mysql(){
$COLOR"开始安装MySQL数据库..."$END
yum -y -q install libaio numactl-libs ncurses*
cd $SRC_DIR
tar xf $MYSQL -C /usr/local
MYSQL_DIR=`echo $MYSQL | sed -nr 's/^(.*[0-9]).*/\1/p'`
ln -s /usr/local/$MYSQL_DIR /usr/local/mysql
chown -R root.root /usr/local/mysql
id mysql &> /dev/null || { useradd -s /sbin/nologin -r mysql ;echo "创建mysql用户"; }
echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
ln -s /usr/local/mysql/bin/* /usr/bin
cat > /etc/my.cnf << EOF
[mysqld]
server-id=1
log-bin
socket=/data/mysql/mysql.sock
datadir=/data/mysql
log-error=/data/mysql/mysql.log
pid-file=/tmp/mysql.sock
[client]
socket=/data/mysql/mysql.sock
EOF
[ -d /data ] || mkdir /data
mysqld --initialize --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
[ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &> /dev/null
echo "数据库安装完成"
}
check
install_mysql
2、创建测试使用的库和表
进入MySQL数据库中,进行创建对应的库表,密码在脚本中有定义哈!
mysql -u root -p
创建数据库test
create database test;
#进入库中
use test
#将准备好的数据导入到test库中 ,需指定路径
\. /root/a.sql
查看test库中导入的表数据
show tables;
二、冷备份(物理备份)
1、物理备份
物理备份,直接使用cp、tar 等复制归档工具,与存储引擎有关,占用较多空间,备份速度快,恢复快。
备份前,需要将数据库进行停服。
service mysqld stop
进入数据存储目录,将数据文件直接进行复制备份
cd /data
cp -rp mysql/ backup
当数据库中的数据被错误操作时
#删除表students
drop tables students;
2、恢复数据
将数据库进行停服,并将原文件进行删除,将备份文件替换原文件的位置
启动服务,并进行检测
可以看到数据恢复正常
三、热备份。读写操作均可执行
使用mysqldump ,逻辑备份工具,适用所有存储引擎,温备,支持完全或部分备份
常见选项:
-A ,--all-databases 备份所有数据,含create database
-B ,--databases db_name 指定备份的数据库,包括create database语句
-E ,--events 备份相关的所有event scheduler
-R ,--routines 备份所有存储过程和自定义函数
--triggers :备份表相关触发器,默认启用,使用 --skip-triggers,不备份触发器
--default-character-ser=utf8 指定字符集
--master-data [=#] :此选项须启用二进制日志 (现在使用 --source-data=#)
1:所备份的数据之前加一条记录为change master to语句,非注释,不指定#,默认为1,(即备份又同步)
2:记录为注释的change master to 语句,此选项会自动关闭 --lock-tables功能,自动打开 -x | --lock-all-tables功能(除非开启--single-transaction)(只支持热备,为热备而准备的)
-F , --flush-logs :备份前滚动日志,锁定表完成后,执行flush logs 命令,生成新的二进制日志文件,配合-A 或 -B选项时,会导致刷新多次数据库,建议在同一时刻执行转储和日志刷新,可通过和--single-transaction 或-x,--master-data一起使用实现,此时只刷新一次日志
--compact 去掉注释,适合调试,生产不使用
-d , --no-data 只备份表结构(表头,无数据)
-t , --no-create-info 只备份数据不备份create table(无表头)
-n ,--no-create-db 不备份create database,可被-A或-B覆盖
--flush-privileges 备份mysql或相关时需要使用
-f , --force 忽略SQL错误,继续执行
--hex-blob 使用十六进制符号转储二进制列,当包括binary,varbinary,blob,bit的数据类型的列时使用,避免乱码
-q , --quick 不缓存查询,直接输出,加快备份速度
1、数据备份
对数据库mysql 和 test 进行备份
mysqldump -u root -p -B mysql test -F --single-transaction --source-data=2 > /data/all.sql
使用 --master-data ,须打开二进制日志才行
须先开启记录日志,使 sql_log_bin = on ,一般默认是 on
其也需要确保启用二进制日志功能,使得 log_bin = on
查看使用中的二进制日志文件
show master status;
进入二进制日志文件中进行查看
mysqlbinlog chen2-bin.000005
进入test库中进行删除teachers表进行测试,mysql库中db表删除
2、恢复数据
(1)将备份的数据导入到mysql数据库中
mysql -u root -p < /data/all.sql
进入数据库中进行查看
(2)、在数据库中直接插入备份数据也可以
查看二进制日志节点状态,可见,恢复数据时,也是会记录到二进制日志中的,但这些数据一般都为无用的数据,已做过备份的
因此当数据恢复时,一般都将二进制日志进行临时关闭
show master status;
四、通过二进制日志进行恢复错误操作的数据
1、重置二进制日志
先对二进制日志进行刷新,重启,方便观察
reset master;
在表中插入若干数据
insert into teachers (tid,name) values (5,'simayi');
insert into students (stuid,name) values (26,'chen'),(27,'xiaoming');
2、删除或修改数据
然后对插入的数据进行删除修改
删除students 表中的一行数据
delete from students where stuid=26;
3、将二进制文件导出为SQL脚本
查看二进制日志内容
show binlog events;
因为在SQL语句中,无法直接进行处理,因此,需要先对日志导出为SQL脚本
mysqlbinlog mysql/chen2-bin.000001 > ./binlog-000001.sql
4、修改导出的SQL脚本,将错误的命令删除
上面是使用 drop 命令删除的 teachers 表,找到该项,进行删除
使用的delete命令删除的students 表中的内容,找到该项,进行删除
5、临时关闭二进制日志,进行数据恢复
临时关闭二进制日志
删除test 库
先将备份的test和mysql 数据库进行导入到MySQL服务中,
查看表的数据
全面备份后,增加的数据并未恢复
借助二进制节点进行进一步的恢复数据,并进行查看数据是否恢复
然后将二进制日志打开;
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)