mysql怎么操作备份

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql怎么操作备份相关的知识,希望对你有一定的参考价值。

1、建立自动备份脚本
为了使数据库备份和恢复的符合我们的实际要求(备份保留七天,每天凌晨备份一次),用一段符合要求的Shell脚本来实现整个备份过程的自动化。
[root@mysqltest ~]# vim mysql-backup.sh
#!/bin/bash
##作者:Barlow##
##最后修订:2013-6-25##
#脚本作用:备份Mysql数据库
#
#设定备份保留天数K
K=7
#
TODAY=`date '+%Y%m%d'`
KDAY=`date -d "$TODAY - $K day" '+%Y%m%d'`
BACKDIR=/var/mysqlbak/$TODAY
KDAYDIR=/var/mysqlbak/$KDAY
mkdir -p $BACKDIR
#
# The Password of MySQL
ROOTPASS=******* ##将*替换为实际mysql数据库的root密码
#
# Get the Name of Database
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`
#
# Backup with Database
for dbname in $DBLIST
do
mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy
done
#
#删除过期备份
if [ -d "$KDAYDIR" ];then
rm -rf $KDAYDIR
exit
fi
改变脚本权限,root具有完全权限,其他用户没有任何权限:
[root@mysqltest ~]# chmod 700 mysql-backup.sh
运行一次脚本:
[root@mysqltest ~]# ./mysql-backup.sh
查看运行结果:
[root@mysqltest ~]# ll /var/mysqlbak/20130625/
mysql/ wordpress/
[root@mysqltest ~]# ll /var/mysqlbak/20130625/
总用量 8
drwxr-x---. 2 mysql mysql 4096 6月 25 14:26 mysql
drwxr-x---. 2 mysql mysql 4096 6月 25 14:26 wordpress
可以看到备份已经成功完成。
2、创建自动任务每天运行
[root@mysqltest ~]# crontab -e
00 01 * * * /root/mysql-backup.sh
##每天凌晨1点运行一次
参考技术A mysql shell
使用默认参数zstd压缩+32M chunk并行导出,恢复时单表可以并行load data,其备份和恢复速度均优于非压缩+非分块。 测试中发现,若禁用压缩,也会禁用分块。
mysqldump
备份和恢复都是单线程执行,不压缩的备份效率更快,zstd的实时备份速度比gzip更快,恢复速度最慢。
mysqlpump
备份支持并行速度也很快,但是单线程恢复是硬伤。
mydumper
默认用gzip协议,备份速度与mysqldump基本一样,看来瓶颈在压缩上。
在非压缩非分块备份速度会更快。
恢复速度中等,单表无法并行。

综合上述测试结果,mysql shell新的备份恢复方式是最快的,得益于使用了zstd实时压缩算法,备份恢复均可以并行,对于单个大表也可以并行。

MySQL全备份如何只恢复一个库或者一个表

你好!

这个问题不是MYSQL数据库方面的问题,而是如何从一个文本文件中取出需要的部分内容的问题。 从数据库角度来说,没有什么好办法,可以使用操作系统中的文本编辑处理工具来实现。例如,如果不是太大,几百M可以用editplus,ultraedit等编辑工具打开找你需要sql拷贝出来导入。

如果是linux/unix,可参考如下方法:

1.使用 awk:
可以先到原数据库中使用 'show tables;' 查看数据库表的列表,注意,此列表已经按照字母排序,例如:
table1

table2
table3
然后使用awk 来过滤sql语句,假设你要恢复 table2 表,可以使用下面的语句:
awk ‘/^-- Table structure for table .table2./,/^-- Table structure for table .table3./print’ mydumpfile.sql > /tmp/recovered_table.sql

2.使用sed:
与上面类似,假设你要恢复 table2 表,可以使用下面的语句:
cat mydumpfile.sql | sed -n -e '/Table structure for table .test1./,/Table structure for table .test2./p' > /tmp/extracted_table.sql
参考技术A

前言

MySQL 5.6引入了GTID,每个事务都会产生一个GTID,我们可以通过验证主从GTID来验证主从数据的一致性。

为了叙述简便,定义一个量ALL_GTID: 表示某个数据库实例上 所有存在过的 或 将要存在的事务 的GTID(包括已经被purge掉的事务)。

在讨论数据库可用性的场景中, 当发生主备切换时, 需要进行数据补偿。通过比较主备的ALL_GTID,可以确定需要补偿多少数据:

    在实例存活的情况,可以在实例状态中查询ALL_GTID。

    在实例崩溃的情况,无法在实例状态中查询ALL_GTID。可以通过查询BINLOG中的Previous-GTIDs计算来获得ALL_GTID。

    下面列举与ALL_GTID相关的变量。

    与ALL_GTID相关的变量

    Previous-GTIDs

    Previous-GTIDs格式如下(环境为MySQL5.7,日志手动flush binary logs获得):

    查看新轮转出的BINLOG:


    下面为mysql-bin.00001中包含的GTID:

    请点击输入图片描述


    然后再次flush binary logs:

    请点击输入图片描述


    mysql-bin.00002中是没有任何GTID的。

    请点击输入图片描述


    综上Previous-GTIDs是本身这个BINLOG文件前面的所有BINLOG的集合。

    请点击输入图片描述

    全局变量中的GTID相关的变量

    请点击输入图片描述

    变量解释:

    gtid_executed 代表着server上所有事务执行产生的GTID(包含已经被purge的BINLOG中的GTID或者是手动set gtid_purged的GTID)。

    gtid_purged 代表着已经被purge到的GTID。gtid_purged是gtid_executed的子集。

    gtid_retrieved 是从机上relay_log中的GTID。

    ALL_GTID 的计算

    了解了GTID相关的变量之后,可以得到获得实例的All_GTID的集合的方法:

    对象

    方法

    存活的Master实例    gtid_executed    

    存活的Slave实例    gtid_executed和gtid_retrieved的并集    

    非存活Master实例    最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID    

    非存活Slave实例    最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID    

    在获得非存活实例中的ALL_GTID时,最后一个BINLOG文件中的GTID可能不连续(比如事务同时来自于本实例客户端和复制回放),所以需要扫描最后一个BINLOG文件。

    生产中我们使用Xtrabackup来产生一个 从实例 的流程如下:

    拉取备份,进行还原

    change master to

    set @@global.gtid_purged='xxx';

    set @@global.gtid_purged='xxx'; 的影响:

    将 从实例 的ALL_GTID手工置为xxx, 在通过GTID方式建立复制时不会出错.

    将更新Binlog中记录的Previous-GTIDs (由于Binlog不可改变, 将产生新的Binlog, 记录新的Previous-GTIDs).

    MySQL 5.7中set gtid_purged的行为变更

    问题描述

    回顾一下备份恢复的流程:

    拉取备份,进行还原

    change master to

    set @@global.gtid_purged='xxx';

    现象: 发现有一台MySQL 5.7的Slave服务器恢复后没有产生 正确的Previous-GTIDs。

    分析

    分析整个过程,解决问题应该分阶段进行手动模拟发现问题。以下为详细步骤:

    手工还原备份

    环境

    BINLOG数量,Previous-GTIDs状态

    Xtrabackup 2.4.2 & MySQL 5.6    1,空    

    Xtrabackup 2.4.2 & MySQL 5.7    1,空    

    Xtrabackup 2.2.9 & MySQL 5.6    1,空    

    Xtrabackup 2.2.9 & MySQL 5.7    1,空    

    可见: 恢复过程不会轮转BINLOG。

    验证change master和set gtid_purged在不同的MySQL版本中执行的差异

    环境

    BINLOG数量,Previous-GTIDs状态

    change master & MySQL 5.6    1,空    

    change master & MySQL 5.7    1,空    

    set gtid_purged & MySQL 5.6    2,正常    

    set gtid_purged & MySQL 5.7    1,空    

    可见: 执行set gtid_purged时不同版本的MySQL产生了差异

    验证

    对不同版本MySQL单独执行set @@global.gtid_purged='';语句。检查结果

    环境

    进行的操作

    BINLOG数量,Previous-GTIDs状态

    MySQL 5.7    reset master; set @@global.gtid_purged=”;    1,空    

    MySQL 5.6    reset master; set @@global.gtid_purged=”;    2,正常    

    结论

    参考: http://bugs.mysql.com/bug.php?id=75767

    官方解释: 在5.7版本中,执行SET GTID_PURGED语句后binlog_simple_gtid_recovery会给GTID_PURGED计算出一个错误的值。

    由于5.7中新增了存储GTID的表。所以5.7版本中set @@global.gtid_purged='';语句被改成只修改存放GTID的表。

    而5.6版本中会进行BINLOG轮转和向Previous_gtids_log_event中添加GTID。如果5.7需要产生和5.6相同结果的话,可以在SET GTID_PURGED语句后手动执行flush binary logs语句。

以上是关于mysql怎么操作备份的主要内容,如果未能解决你的问题,请参考以下文章

mysql备份数据库 怎么锁表

mysql 数据被清空了怎么恢复

mysql怎么查看删除的数据库

怎么备份mysql数据库中一张表

用sql manager for mysql工具向MySQL里导入外来备份文件(可视化操作)

MySQL误操作删除后,怎么恢复数据?