MySQL中的备份和恢复_mysql怎么恢复上一步,软件测试开发全套学习-程序员宅基地

技术标签: 2024年程序员学习  学习  mysql  数据库  

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

mysqldump -uroot -proot --database commany bbs > fullbak.sql

9)导出单个数据库(只要结构,不要数据)

mysqldump -uroot -proot --no-data --database commany > fullbak.sql

10)导出多个数据库(只要结构,不要数据)

mysqldump -uroot -proot --no-data --database commany bbs > fullbak.sql

11)导出单个数据库(只要数据,不要结构)

mysqldump -uroot -proot --no-create-db --no-create-info --database commany > fullbak.sql

12)导出单个库(排除某个表)

mysqldump -uroot -proot --database commany --ignore-table=commany.user > fullbak.sql

13)导出某个表的某一些数据(按条件)

mysqldump -uroot -proot --database commany user --where=“user_id<1000” > fullbak.sql

以上的这些备份命令,他都是逻辑备份,备份出来的都是sql命令,对于数据小于100G的 这么备份没啥大问题,但是数据量太大了我们就不能这么备份了 ,太慢了。后面我接着给大家分享一些企业中常用的物理备份的操作。

7、MySQL之 XtraBackup 备份

MySQL 系列连载之 XtraBackup 备份原理(1)

导读

在日常的linux运维工作中,大数据量备份与还原,始终是个难点。关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天本文推荐另一个备份工具innobackupex。

Xtrabackup简介

innobackupex和mysqldump都可以对mysql进行热备份的,mysqldump对mysql的innodb的备份可以使用single-transaction参数来开启一个事务,利用innodb的mvcc来不进行锁表进行热备份,mysqldump备份是逻辑备份,备份出来的文件是sql语句,所以备份和恢复的时候很慢,但是备份和恢复时候很清楚。当MYSQL数据超过10G时,用mysqldump来导出备份就比较慢了,此种情况下用innobackupex这个工具就比mysqldump要快很多。利用它对mysql做全量和增量备份.

Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写)
此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。

XtraBackup是目前首选的备份方案之一

原理

在这里插入图片描述
1、MySQL主从同步原理

MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的
通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,然后传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。

2、XtraBackup备份原理

innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用InnoDB崩溃恢复代码执行事务日志(redo log),以达到数据的一致性。

3、备份的两个过程

backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。

preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。

4、XtraBackup的优点

1、可以快速可靠的完成数据备份(复制数据文件和追踪事务日志)

2、数据备份过程中不会中断事务的处理(热备份)

3、节约磁盘空间和网络带宽

4、自动完成备份鉴定

5、因更快的恢复时间而提高在线时间

5、Xtrabackup的两个工具

1)xtrabackup :只能用于热备份innodb,xtradb两种数据引擎表的工具,不能备份其他表。

2)innobackupex:是一个对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。主要是为了方便同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。 innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。innobackupex同时支持innodb,myisam。

6、Xtrabackup可以做什么

1)在线(热)备份整个库的InnoDB, XtraDB表

2)在xtrabackup的上一次整库备份基础上做增量备份(innodb only)

3)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。

7、Xtrabackup工具工作原理

支持对InnoDB存储引擎的增量备份

1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。

2)在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

8、innobackupex备份mysql数据的流程

innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件。

9、innobackupex恢复mysql数据的流程

innobackupex首先读取my.cnf,查看变量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。
10、innobackupex备份和恢复的工作原理
(1)备份的工作原理
MySQL 系列连载之 XtraBackup 备份原理(1)插图(2)

1、备份开始时首先会开启一个后台检测进程,实时检测mysql
redo的变化,一旦发现redo中有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中。

2、之后复制innodb的数据文件和系统表空间文件ibdata1,待复制结束后。

3、执行flush tables with read lock操作。

4、复制.frm,MYI,MYD,等文件(执行flush tableswith read
lock的目的是为了防止数据表发生DDL操作,并且在这一时刻获得binlog的位置)。

5、最后会发出unlock tables,把表设置为可读可写状态。

6、最终停止xtrabackup_log。

(2)恢复的工作原理

1、为了恢复一个备份,innobackupex需要以–copy-back选项启动。

2、innobackupex将会首先通过my.cnf文件读取如下变量:datadir,innodb_data_home_dir,innodb_data_file_path,
innodb_log_group_home_dir,并确定这些目录存在。

3、接下来,此脚本将会首先拷贝MyISAM表、索引文件、其他类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG,
.TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files)

4、接下来拷贝InnoDB表数据文件,最后拷贝日志文件。

5、拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能需要更改文件的owener(如从拷贝文件的user更改到mysql用户)。

MySQL 系列连载之 XtraBackup 全量热备 or 恢复实践(2)

1、准备工作
#系统环境

[root@master tools]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@master tools]# uname -r
2.6.32-642.el6.x86_64

#主数据库版本

[root@master ~]# mysql -V
mysql Ver 14.14 Distrib 5.5.32, for Linux (x86_64) using readline 5.1

#检查数据库引擎

mysql> show engines;

#主从数据库同步注意点 [mysqld]

#主从之间的id不能相同 server-id

#启用二进制日志 log-bin

#一般在从库开启(可选) read_only #推荐使用InnoDB并做好相关配置

#检查主从数据库状态

[root@master ~]# mysql -e “show global variables like ‘server_id’;”
±--------------±------+
| Variable_name | Value |
±--------------±------+
| server_id | 241 |
±--------------±------+
[root@slave01 ~]# mysql -e “show global variables like ‘server_id’;”
±--------------±------+
| Variable_name | Value |
±--------------±------+
| server_id | 242 |
±--------------±------+

2、安装percona-xtrabackup
官网安装包地址 - https://www.percona.com/downloads/XtraBackup/LATEST/

1)源码安装Xtrabackup

将源码包下载到/usr/local/src下

源码包下载

cd /usr/local/src

#安装依赖
yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool zlib-devel libgcrypt-devel libcurl-devel crypt* libgcrypt* python-sphinx openssl imake libxml2-devel expat-devel ncurses5-devel ncurses-devle vim-common libgpg-error-devel libidn-devel perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL

#下载源码包
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/source/percona-xtrabackup-2.1.9.tar.gz

#解压源码包
tar -zvxf percona-xtrabackup-2.1.9.tar.gz

cd percona-xtrabackup-2.1.9

[root@master percona-xtrabackup-2.1.9]# ./utils/build.sh //执行该安装脚本,会出现下面信息
Build an xtrabackup binary against the specified InnoDB flavor.

Usage: build.sh CODEBASE
where CODEBASE can be one of the following values or aliases:
innodb51 | plugin build against InnoDB plugin in MySQL 5.1
innodb55 | 5.5 build against InnoDB in MySQL 5.5
innodb56 | 5.6,xtradb56, build against InnoDB in MySQL 5.6
| mariadb100,galera56
xtradb51 | xtradb,mariadb51 build against Percona Server with XtraDB 5.1
| mariadb52,mariadb53
xtradb55 | galera55,mariadb55 build against Percona Server with XtraDB 5.5

根据上面提示和你使用的存储引擎及版本,选择相应的参数即可。因为我用的是MySQL 5.5版本,所以执行如下语句安装:

[root@master percona-xtrabackup-2.1.9]# ./utils/build.sh innodb55

以上语句执行成功后,表示安装完成。

最后,把生成的二进制文件拷贝到一个自定义目录下(本例中为/home/mysql/admin/bin/percona-xtrabackup-2.1.9),并把该目录放到环境变量PATH中。

mkdir -p /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

mv /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_innodb55 xtrabackup_55

cp /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_55 /usr/local/src/percona-xtrabackup-2.1.9/src/xbstream /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

vim /etc/profile

export PATH=$PATH:/home/mysql/admin/bin/percona-xtrabackup-2.1.9/

刷新profile并测试下innobackupex是否正常使用

source /etc/profile

测试下innobackupex是否正常使用

innobackupex --help

3、全量备份和恢复
1)全量备份操作

执行下面语句进行全备: mysql的安装目录是/application/mysql/ mysql的配置文件路径/etc/my.cnf 全量备份后的数据存放目录是/backup/mysql/data

mkdir -p /backup/mysql/data/

innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/

170404 12:46:29 innobackupex: Waiting for log copying to finish

xtrabackup: The latest check point (for incremental): ‘1639325’
xtrabackup: Stopping log copying thread.
.>> log scanned up to (1639325)

xtrabackup: Creating suspend file ‘/backup/mysql/data/2017-04-04_12-46-24/xtrabackup_log_copied’ with pid ‘21223’
xtrabackup: Transaction log of lsn (1639325) to (1639325) was copied.
170404 12:46:30 innobackupex: All tables unlocked

innobackupex: Backup created in directory ‘/backup/mysql/data/2017-04-04_12-46-24’
innobackupex: MySQL binlog position: filename ‘mysql-bin.000019’, position 967
170404 12:46:30 innobackupex: Connection to database server closed
170404 12:46:30 innobackupex: completed OK!

出现上面的信息,表示备份已经ok。

上面执行的备份语句会将mysql数据文件(即由my.cnf里的变量datadir指定)拷贝至备份目录下(/backup/mysql/data)

注意:如果不指定–defaults-file,默认值为/etc/my.cnf。 备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/mysql/data/2017-04-04_12-46-24),在该目录下存放备份文件。

[root@master data]# ll /backup/mysql/data/

总用量 4

drwxr-xr-x 6 root root 4096 4月 4 16:56 2017-04-04_16-56-35

[root@master data]# ll 2017-04-04_16-56-35/

总用量 18468

-rw-r–r-- 1 root root 188 4月 4 16:56 backup-my.cnf

-rw-r----- 1 root root 18874368 4月 4 16:56 ibdata1

drwxr-xr-x 2 root root 4096 4月 4 16:56 mysql

drwxr-xr-x 2 root root 4096 4月 4 16:56 performance_schema

drwxr-xr-x 2 root root 4096 4月 4 16:56 test

-rw-r–r-- 1 root root 13 4月 4 16:56 xtrabackup_binary

-rw-r–r-- 1 root root 23 4月 4 16:56 xtrabackup_binlog_info

-rw-r----- 1 root root 89 4月 4 16:56 xtrabackup_checkpoints

-rw-r----- 1 root root 2560 4月 4 16:56 xtrabackup_logfile

drwxr-xr-x 2 root root 4096 4月 4 16:56 xtra_test

还可以在远程进行全量备份,命令如下:

innobackupex --defaults-file=/etc/my.cnf --user=root --host=127.0.0.1 --parallel=2 --throttle=200 /backup/mysql/data 2>/backup/mysql/data/bak.log 1>/backup/mysql/data/
data +%Y-%m-%d_%H-%M%S

参数解释:

–user=root 备份操作用户名,一般都是root用户

–host=127.0.0.1 主机ip,本地可以不加(适用于远程备份)。注意要提前在mysql中授予连接的权限,最好备份前先测试用命令中的用户名、密码和host能否正常连接mysql。

–parallel=2 --throttle=200 并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。

/backup/mysql/data 备份存放的目录

2>/backup/mysql/data/bak.log 备份日志,将备份过程中的输出信息重定向到bak.log

这种备份跟上面相比,备份成功后,不会自动在备份目录下创建一个时间戳目录,需要如上命令中自己定义。

[root@master src]# ll /backup/mysql/data/
总用量 8
drwxr-xr-x 6 root root 4096 4月 4 12:46 2017-04-04_12-46-24
-rw-r–r-- 1 root root 106 4月 4 12:57 bak.log //备份信息都记录在这个日志里,如果备份失败,可以到这里日志里查询

2)全量备份后的恢复操作

#进入数据库
[root@master data]# mysql

#查看当前所有数据库
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| xtra_test |
±-------------------+
5 rows in set (0.09 sec)

#切换到 xtra_test数据库下
mysql> use xtra_test;
Database changed

#查看当前数据库里的表
mysql> show tables;
±--------------------+
| Tables_in_xtra_test |
±--------------------+
| I |
| M |
±--------------------+
2 rows in set (0.04 sec)

#删除整个 xtra_test库
mysql> drop database xtra_test;
Query OK, 2 rows affected (0.34 sec)

#现在已经看不到 xtra_test库了
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+
4 rows in set (0.00 sec)

注意:恢复之前

1)要先关闭数据库

2)要删除数据文件和日志文件(也可以mv移到别的地方,只要确保清空mysql数据存放目录就行)

[root@master data]# ps -ef|grep mysqld
root 10929 1 0 10:32 pts/0 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --datadir=/application/mysql/data --pid-file=/application/mysql/data/master.pid
mysql 11227 10929 0 10:32 pts/0 00:00:14 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/application/mysql/data/master.err --pid-file=/application/mysql/data/master.pid --port=3306
root 21514 1896 0 13:55 pts/0 00:00:00 grep mysqld

由上面可以看出mysql的数据和日志存放目录是/application/mysql/data

#关闭MySQL数据库服务
[root@master data]# service mysqld stop
Shutting down MySQL… SUCCESS!

#移动数据文件和日志文件到/tmp(当然删除也可以)
[root@master data]# mv /application/mysql/data/* /tmp/

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --use-memory=1G --apply-log /backup/mysql/data/2017-04-04_13-04-05/

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-04-04_13-04-05/

[root@master ~]# chown -R mysql.mysql /application/mysql/data/

可能报错:

sh: xtrabackup: command not found innobackupex: Error: no ‘mysqld’
group in MySQL options at
/home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.

解决:将xtrabackup_55复制成xtrabackup即可

[root@master src]# ls /home/mysql/admin/bin/percona-xtrabackup-2.1.9/
innobackupex xbstream xtrabackup_55 xtrabackup_innodb55

[root@master src]# cd /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[root@master percona-xtrabackup-2.1.9]# cp xtrabackup_55 xtrabackup

[root@master percona-xtrabackup-2.1.9]# ls
innobackupex xbstream xtrabackup xtrabackup_55 xtrabackup_innodb55

检验:执行之后就OK了

[root@master percona-xtrabackup-2.1.9]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-04-04_13-04-05/

innobackupex: Copying ‘/backup/mysql/data/2017-04-04_13-04-05/ib_logfile1’ to ‘/application/mysql/data/ib_logfile1’
innobackupex: Copying ‘/backup/mysql/data/2017-04-04_13-04-05/ib_logfile0’ to ‘/application/mysql/data/ib_logfile0’
innobackupex: Finished copying back files.

170404 14:24:07 innobackupex: completed OK!

出现上面的信息,说明数据恢复成功了!!

从上面的恢复操作可以看出,执行恢复分为两个步骤:

1)第一步恢复步骤是应用日志(apply-log),为了加快速度,一般建议设置–use-memory(如果系统内存充足,可以使用加大内存进行备份 ),这个步骤完成之后,目录/backup/mysql/data/2017-04-04_13-04-05/下的备份文件已经准备就绪。

2)第二步恢复步骤是拷贝文件(copy-back),即把备份文件拷贝至原数据目录下。

最后,启动mysql,查看数据是否恢复回来了

#启动数据库
[root@master ~]# /etc/init.d/mysqld start
Starting MySQL… SUCCESS!

#进入MySQL
[root@master ~]# mysql

#显示所有数据库(可以看到我们之前删除的xtra_test 库已经恢复了)
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| xtra_test |
±-------------------+
5 rows in set (0.00 sec)

#进入xtra_test 库
mysql> use xtra_test;
Database changed

#查看xtra_test 库内表内容(已经全部恢复)
mysql> show tables;
±--------------------+
| Tables_in_xtra_test |
±--------------------+
| I |
| M |
±--------------------+
2 rows in set (0.00 sec)

MySQL 系列连载之 XtraBackup 增量热备 or 恢复实践(3)

增量备份和恢复
特别注意:

innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

1)增量备份操作
增量备份需要基于全量备份

先假设我们已经有了一个全量备份(如上面的/backup/mysql/data/2017-04-04_16-56-35),我们需要在该全量备份的基础上做第一次增量备份。

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_16-56-35/ --incremental /backup/mysql/data

其中:

–incremental-basedir 指向全量备份目录 --incremental 指向增量备份的目录

上面语句执行成功之后,会在–incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/mysql/data/2017-04-04_14-37-24),在该目录下存放着增量备份的所有文件。

[root@master data]# ll
总用量 8
drwxr-xr-x 6 root root 4096 4月 4 16:56 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 16:59 2017-04-04_16-58-58 //增量备份目录

在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,其中可以查出

1)全量备份的信息如下:

[root@master data]# cd /backup/mysql/data/2017-04-04_16-56-35/
[root@master 2017-04-04_16-56-35]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1639436
last_lsn = 1639436
compact = 0

2)基于以上全量备份的增量备份的信息如下:

[root@master data]# cd /backup/mysql/data/2017-04-04_16-58-58/
[root@master 2017-04-04_16-58-58]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1639436
to_lsn = 1639436
last_lsn = 1639436
compact = 0

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。

那么,我们是否可以在增量备份的基础上再做增量备份呢?

答案是肯定的,只要把–incremental-basedir执行上一次增量备份的目录即可,如下所示:

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_16-58-58/ --incremental /backup/mysql/data

[root@master ~]# ll /backup/mysql/data/
总用量 12
drwxr-xr-x 6 root root 4096 4月 4 16:56 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 16:59 2017-04-04_16-58-58 //增量备份目录1
drwxr-xr-x 6 root root 4096 4月 4 17:02 2017-04-04_17-02-35 //增量备份目录2

它的trabackup_checkpoints记录着备份信息如下:

[root@master ~]# cd /backup/mysql/data/2017-04-04_17-02-35/
[root@master 2017-04-04_17-02-35]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1639436
to_lsn = 1639436
last_lsn = 1639436
compact = 0

可以看到,第二次增量备份的from_lsn是从上一次增量备份的to_lsn开始的

2)增量备份后的恢复操作
增量备份的恢复要比全量备份复杂很多,增量备份与全量备份有着一些不同,尤其要注意的是:

1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

2)基于所有的备份将未提交的事务进行“回滚”。于是,操作就变成了:不能回滚,因为有可能第一次备份时候没提交,在增量中已经成功提交

第一步是在所有备份目录下重做已提交的日志(注意备份目录路径要跟全路径)

其中:

一定要全路径

BASE-DIR 是指全量备份的目录

INCREMENTAL-DIR-1 是指第一次增量备份的目录

INCREMENTAL-DIR-2 是指第二次增量备份的目录,以此类推。

这里要注意的是:

1)最后一步的增量备份并没有–redo-only选项!回滚进行崩溃恢复过程

2)可以使用–use_memory提高性能。

3)以上语句执行成功之后,最终数据在BASE-DIR(即全量目录)下,其实增量备份就是把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的还原。

第一步完成之后,我们开始下面关键的第二步,即拷贝文件,进行全部还原!注意:必须先停止mysql数据库,然后清空数据库目录(这里是指/data/mysql/data)下的文件。

4)innobackupex --copy-back BASE-DIR

同样地,拷贝结束之后,记得检查下数据目录(这里指/data/mysql/data)的权限是否正确(修改成mysql:mysql),然后再重启mysql。

接下来进行案例说明:

假设我们已经有了一个全量备份2017-04-04_16-56-35 删除在上面测试创建的两个增量备份

[root@master ~]# cd /backup/mysql/data/

[root@master data]# ll
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-58-58
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_17-02-35

[root@master data]# rm -fr 2017-04-04_16-58-58 2017-04-04_17-02-35

[root@master data]# ll
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35

假设在全量备份后,mysql数据库中又有新数据写入

#进入数据库
[root@master data]# mysql

#创建一个叫做 ceshi 的数据库
mysql> create database ceshi;
Query OK, 1 row affected (0.00 sec)

#切换到 ceshi 库下
mysql> use ceshi
Database changed

#创建一个叫做 test1 的表
mysql> create table test1(
-> id int3,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.26 sec)

#往test1表中插入数据
mysql> insert into test1 values(1,“chenbaojia”);
Query OK, 1 row affected (0.05 sec)

#查看 test1 表中的内容
mysql> select * from test1;
±-----±-----------+
| id | name |
±-----±-----------+
| 1 | chenbaojia |
±-----±-----------+
1 row in set (0.00 sec)

#查看当前所有数据库
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| test |
±-------------------+
5 rows in set (0.00 sec)

然后进行一次增量备份:

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_16-56-35/ --incremental /backup/mysql/data/

[root@master data]# ll
总用量 8
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 17:28 2017-04-04_17-28-14 //增量备份目录

接着再在mysql数据库中写入新数据

[root@master data]# mysql

mysql> use ceshi;
Database changed

mysql> insert into test1 values(2,“pelosi”);
Query OK, 1 row affected (0.11 sec)

mysql> insert into test1 values(3,“hiofo”);
Query OK, 1 row affected (0.06 sec)

mysql> insert into test1 values(4,“mac”);
Query OK, 1 row affected (0.09 sec)

mysql> select * from test1;
±-----±-----------+
| id | name |
±-----±-----------+
| 1 | chenbaojia |
| 2 | pelosi |
| 3 | hiofo |
| 4 | mac |
±-----±-----------+
4 rows in set (0.00 sec)

接着在增量的基础上再进行一次增量备份

–incremental-basedi 要写上次最后增量备份的目录

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_17-28-14/ --incremental /backup/mysql/data

[root@master ~]# ll /backup/mysql/data/
总用量 12
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 17:28 2017-04-04_17-28-14 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 17:38 2017-04-04_17-37-58 //全量备份目录

现在删除数据库ceshi 、 test

[root@master ~]# mysql

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| test |
±-------------------+
5 rows in set (0.00 sec)

mysql> drop database ceshi;
Query OK, 1 row affected (0.07 sec)

mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
±-------------------+
3 rows in set (0.00 sec)

接下来就开始进行数据恢复操作:

先恢复应用日志(注意最后一个不需要加–redo-only参数)

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-04-04_16-56-35/

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-04-04_16-56-35/ --incremental-dir=/backup/mysql/data/2017-04-04_17-28-14/

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /backup/mysql/data/2017-04-04_16-56-35/ --incremental-dir=/backup/mysql/data/2017-04-04_17-37-58/

到此,恢复数据工作还没有结束!还有最重要的一个环节,就是把增量目录下的数据整合到全量备份目录下,然后再进行一次全量还原。

停止mysql数据库,并清空数据目录

[root@master ~]# /etc/init.d/mysqld stop
Shutting down MySQL. SUCCESS!
[root@master ~]# rm -fr /application/mysql/data/*

最后拷贝文件,并验证数据目录的权限

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-04-04_16-56-35/

[root@master ~]# chown -R mysql.mysql /application/mysql/data/*

[root@master ~]# /etc/init.d/mysqld start
Starting MySQL… SUCCESS!

[root@master ~]# mysql

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| test |
| xtra_test |
±-------------------+
6 rows in set (0.00 sec)

mysql> select * from ceshi.test1;
±-----±-----------+
| id | name |
±-----±-----------+
| 1 | chenbaojia |
| 2 | pelosi |
| 3 | hiofo |
| 4 | mac |
±-----±-----------+
4 rows in set (0.00 sec)

另外注意: **上面在做备份的时候,将备份目录和增量目录都放在了同一个目录路径下,其实推荐放在不同的路径下,方便管理!**比如:

/backup/mysql/data/full 存放全量备份目录

/backup/mysql/data/daily1 存放第一次增量备份目录

/backup/mysql/data/daily2 存放第二次增量目录

以此类推

在恢复的时候,注意命令中的路径要跟对!

innobackupex 参数
innobackupex全量、增量备份脚本

可以根据自己线上数据库情况,编写全量和增量备份脚本,然后结合crontab设置计划执行。

比如:每周日的1:00进行全量备份,每周1-6的1:00进行增量备份。

还可以在脚本里编写邮件通知信息(可以用mail或sendemail)

逻辑备份:

备份:

  1. 选择在系统空闲时,比如在夜间,使用 mysqldump –F(flush-logs)备份数据
    库。

mysqldump –u root –p*** pointcard –F > pointcard.sql

  1. 并备份 mysqldump 开始以后生成的 binlog。

恢复:

  1. 停掉应用,执行 mysql 导入备份文件.

mysql –u root –p*** pointcard < pointcard.sql

  1. 使用 mysqlbinlog 恢复自 mysqldump 备份以来的 binlog。

mysqlbinlog $HOME/data/mysql-bin.123456 | mysql -u root –p***

19.4 单个表的备份:

备份:

  1. 方法 1:

mysql > select * into outfile ‘/tmp/order_tab’ fields-terminated-
by=’,’ from order_tab;

  1. 方法 2:

mysqldump –u root –p*** –T /tmp pointcard order_tab --fields-
terminated-by=’,’;

恢复:

  1. 方法 1:

mysql > load data [local] infile ‘/tmp/order_tab’ into table
order_tab fields-terminated-by=’,’;

  1. 方法 2:

mysqlimport –u root –p*** [–local] pointcatd order_tab.txt –
fields-terminated-by=’,’;

注意:如果导入和导出是跨平台操作的(windows 和 linux),那么要注意设置参数 line-
terminated-by, windows 上设置为 line-terminated-by=’\r\n’,linux 上设置为
line-terminated-by=’\n’.

shell备份数据表

用shell实现,以并发进程的形式将mysql数据库所有的表备份到当前目录,并把所有的表压缩到一个压缩包文件里。
假设数据库名字为mydb,用户名为aming,密码为passwd。
提示: 在shell中加上&可以将命令丢到后台,从而可以同时执行多条命令达到并发的效果。

#!/bin/bash
pre=date +%F
for d in mysql -uaming -ppasswd mydb -e "show tables"|grep -v 'Tables_in_'
do
mysqldump -uaming -ppasswd mydb $d > $d.sql &
done
tar czf $pre.tar.gz *.sql
rm -f *.sql

时间点恢复:

  1. 如果上午 10 点发生了误操作,可以用以下语句用备份和 binglog 将数据恢复到故
    障前:

mysqlbinlog --stop-date=“2005-04-20 9:59:59”
/var/log/mysql/bin.123456 | mysql -u root –p mypwd

  1. 跳过故障时的时间点,继续执行后面的 binlog,完成恢复

mysqlbinlog --start-date=“2005-04-20 10:01:00”
/var/log/mysql/bin.123456| mysql -u root -p mypwd \

位置恢复:

和时间点恢复类似,但是更精确,步骤如下:

mysqlbinlog --start-date=“2005-04-20 9:55:00” --stop-date=“2005-04-20
10:05:00” /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

该命令将在/tmp 目录创建小的文本文件,编辑此文件,找到出错语句前后的位置 号 ,
例如前后位置号分别是 368312 和 368315。恢复了以前的备份文件后,你应从命令
行输入下面内容:

mysqlbinlog --stop-position=“368312” /var/log/mysql/bin.123456
| mysql -u root -p mypwd
mysqlbinlog --start-position=“368315” /var/log/mysql/bin.123456
| mysql -u root -p mypwd \

上面的第 1 行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置
直到二进制日志结束的所有事务。因为 g mysqlbinlog 的输出包括每个 SQL 语句记录
之前的 SET TIMESTAMP 语句,恢复的数据和相关 MySQL 日志将反应事务执行的原时
间。

19.8 MyISAM 表修复 :

一张损坏的表的症状通常是查询意外中断并且能看到下述错误:
� “ tbl_name .frm”被锁定不能更改。
� 不能找到文件“ tbl_name .MYI”(Errcode: nnn )。
� 文件意外结束。
� 记录文件被毁坏。
� 从表处理器得到错误 nnn
解决方法如下:

方法一:
myisamchk -r tablename
上面的方法几乎能解决所有问题,如果不行,则使用:
myisamchk -o tablename
方法二:

  1. CHECK TABLE tbl_name [, tbl_name ] … [ option ] …
    option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
  2. REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE
    tbl_name [, tbl_name ] … [QUICK] [EXTENDED] [USE_FRM]

mysql数据库备份恢复

为了避免误操作删除一个表或数据库,平常一定要养成数据库备份的习惯。

备份数据库

mysqldump -uroot -pabcd1234 mysql > /tmp/mysqlbak.sql

Warning: Using a password on the command line interface can be insecure.

恢复数据库

mysql -uroot -pabcd1234 -e “create database mysql2” 创建一个新的数据库mysql2

Warning: Using a password on the command line interface can be insecure.

mysql -uroot -pabcd1234 mysql2 < /tmp/mysqlbak.sql 把之前备份的数据库恢复到新建的数据库mysql2里面去

Warning: Using a password on the command line interface can be insecure.

在这里插入图片描述
备份一个表

mysqldump -uroot -pabcd1234 mysql user > /tmp/user.sql

Warning: Using a password on the command line interface can be insecure.

恢复一个表

mysql -uroot -pabcd1234 mysql2 < /tmp/user.sql

Warning: Using a password on the command line interface can be insecure.

备份所有数据库

mysqldump -uroot -pabcd1234 -A >/tmp/mysql_all.sql

Warning: Using a password on the command line interface can be insecure.

只备份表结构

mysqldump -uroot -pabcd1234 -d mysql2 > /tmp/mysql2.sql

Warning: Using a password on the command line interface can be insecure.

总结:

-A 备份所有的数据库

-d 备份数据库里面的表结构,不备份数据。

备份一个表,先库再表,中间用空格做一个分隔,恢复的时候只需要写mysql就行了,不用写表。

MySQLdump 只适合数据量不大的,如果数据量很大有上百G或者上T的数据量就不适用了。

MySQL实时在线备份恢复方案

快照和复制技术的结合可以保证我们得到一个实时的在线MySQL备份解决方案
当主库发生误操作时,只需要恢复备库上的快照,然后再根据binlog执行point-in-time的恢复即可
下面假定一个场景:
主从架构,没有延迟,某DBA误操作:drop database
接下来我们按照以上场景进行备份恢复模拟测试

1.主库准备测试数据

mysql> create database cnfol;
Query OK, 1 row affected (0.00 sec)

mysql> create table cnfol.t (id int primary key);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into cnfol.t select 1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> insert into cnfol.t select 2;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

到备库确认:

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| cnfol |
| mysql |
| test |
±-------------------+
4 rows in set (0.00 sec)

mysql> select * from cnfol.t;
±—+
| id |
±—+
| 1 |
| 2 |
±—+
2 rows in set (0.00 sec)

2.加个全局读锁
在备库

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

3.为备库所在分区创建快照

[root@localhost ~]# lvcreate --size 1G --snapshot --name backup_mysql /dev/vg/mysql
Logical volume “backup_mysql” created

[root@localhost ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
backup_mysql vg swi-a- 1.00G mysql 0.00
mysql vg owi-ao 2.00G

4.获取二进制日志坐标

在备库:
mysql> show master status;
±-----------------±---------±-------------±-----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±-----------------±---------±-------------±-----------------+
| mysql-bin.000003 | 727 | | |
±-----------------±---------±-------------±-----------------+
1 row in set (0.00 sec)

解锁
在备库:

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

6.挂载快照

root@localhost ~]# mount /dev/vg/backup_mysql /mnt/backup
[root@localhost ~]# cd /mnt/backup/mysql/data/cnfol/ && ls -alh
总计 32K
drwx------ 2 mysql dba 4.0K 10-14 09:57 .
drwx------ 5 mysql dba 4.0K 10-14 09:57 …
-rw-rw---- 1 mysql dba 61 10-14 09:57 db.opt
-rw-rw---- 1 mysql dba 8.4K 10-14 09:57 t.frm
-rw-rw---- 1 mysql dba 14 10-14 09:57 t.MYD
-rw-rw---- 1 mysql dba 2.0K 10-14 10:06 t.MYI

7.主库某无经验DBA误操作

mysql> drop database cnfol;
Query OK, 1 row affected (0.05 sec)

记录下此时时间:2013-10-14 10:17:10

备库确认是否存在库cnfol:

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| test |
±-------------------+
3 rows in set (0.01 sec)

8.备份快照

[root@localhost backup]# pwd
/mnt/backup
[root@localhost backup]# tar -jcv -f /mnt/snapshot/mysql.tar.bz2 *

这里做备份的原因有2点

  • 其一,昂贵的IO,因为磁头要在快照区和系统区来回跑
  • 其二,快照区空间不足,因为是COW原理

9.删除快照

root@localhost ~]# umount /mnt/backup
[root@localhost ~]# lvremove --force /dev/vg/backup_mysql
Logical volume “backup_mysql” successfully removed

10.格式化备库所在分区

[mysql@localhost ~]$ mysqladmin -uroot -poracle shutdown
131014 10:32:40 mysqld_safe mysqld from pid file /mnt/lvm/mysql/data/localhost.localdomain.pid ended
[1]+ Done mysqld_safe

[root@localhost ~]# umount /mnt/lvm
[root@localhost ~]# mkfs -t ext3 /dev/vg/mysql

[root@localhost ~]# mount /dev/vg/mysql /mnt/lvm
[root@localhost ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
mysql vg -wi-ao 2.00G

[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg 4 1 0 wz–n- 3.81G 1.81G

11.解压缩快照到备库所在分区

tar -jxv -f /mnt/snapshot/mysql.tar.bz2 -C /mnt/lvm/

[root@localhost lvm]# pwd
/mnt/lvm

[root@localhost lvm]# ls
lost+found mysql

12.启动MySQL

13.利用binlog执行point-in-time恢复

[mysql@localhost ~]$ mysqlbinlog --stop-datetime=“2013-10-14 10:17:10” /mnt/lvm/mysql/data/mysql-bin.000003 | mysql -uroot -poracle

14.确认数据

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| cnfol |
| mysql |
| test |
±-------------------+
4 rows in set (0.00 sec)

mysql> select * from cnfol.t;
±—+
| id |
±—+
| 1 |
| 2 |
±—+
2 rows in set (0.00 sec)

原文地址:http://www.jh-floor.com/shujuku/Mariadb/10070.html
原文作者:jh-floor

MySQL 数据库定时备份的几种方式(非常全面)

#MySQLdump常用
mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sql

1.备份全部数据库的数据和结构

mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql

2.备份全部数据库的结构(加 -d 参数)

mysqldump -uroot -p123456 -A -d > /data/mysqlDump/mydb.sql

3.备份全部数据库的数据(加 -t 参数)

mysqldump -uroot -p123456 -A -t > /data/mysqlDump/mydb.sql

4.备份单个数据库的数据和结构(,数据库名mydb)

mysqldump -uroot-p123456 mydb > /data/mysqlDump/mydb.sql

  1. 备份单个数据库的结构

mysqldump -uroot -p123456 mydb -d > /data/mysqlDump/mydb.sql

  1. 备份单个数据库的数据

mysqldump -uroot -p123456 mydb -t > /data/mysqlDump/mydb.sql

  1. 备份多个表的数据和结构(数据,结构的单独备份方法与上同)

mysqldump -uroot -p123456 mydb t1 t2 > /data/mysqlDump/mydb.sql

  1. 一次备份多个数据库

mysqldump -uroot -p123456 --databases db1 db2 > /data/mysqlDump/mydb.sql

还原 MySQL 备份内容
有两种方式还原,第一种是在 MySQL 命令行中,第二种是使用 SHELL 行完成还原

1.在系统命令行中,输入如下实现还原:

mysql -uroot -p123456 < /data/mysqlDump/mydb.sql

2.在登录进入mysql系统中,通过source指令找到对应系统中的文件进行还原:

mysql> source /data/mysqlDump/mydb.sql

以下代码功能就是针对mysql进行备份,配合crontab,实现备份的内容为近一个月(31天)内的每天的mysql数据库记录。

编写BASH维护固定数量备份文件
在Linux中,使用vi或者vim编写脚本内容并命名为:mysql_dump_script.sh

#!/bin/bash

#保存备份个数,备份31天数据
number=31
#备份保存路径
backup_dir=/root/mysqlbackup
#日期
dd=date +%Y-%m-%d-%H-%M-%S
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=TankB214
#将要备份的数据库
database_name=edoctor

#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi

#简单写法 mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql
$tool -u u s e r n a m e − p username -p usernameppassword $database_name > b a c k u p d i r / backup_dir/ backupdir/database_name-$dd.sql

#写创建备份日志
echo “create b a c k u p _ d i r / backup\_dir/ backup_dir/database_name-$dd.dupm” >> $backup_dir/log.txt

#找出需要删除的备份
delfile=ls -l -crt $backup_dir/\*.sql | awk '{print $9 }' | head -1

#判断现在的备份数量是否大于$number
count=ls -l -crt $backup\_dir/\*.sql | awk '{print $9 }' | wc -l

if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo “delete $delfile” >> $backup_dir/log.txt
fi

如上代码主要含义如下:

1.首先设置各项参数,例如number最多需要备份的数目,备份路径,用户名,密码等。

2.执行mysqldump命令保存备份文件,并将操作打印至同目录下的log.txt中标记操作日志。

3.定义需要删除的文件:通过ls命令获取第九列,即文件名列,再通过实现定义操作时间最晚的那个需要删除的文件。

4.定义备份数量:通过ls命令加上wc -l统计以sql结尾的文件的行数。

5.如果文件超出限制大小,就删除最早创建的sql文件

使用crontab定期执行备份脚本
在 Linux 中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。

cron服务
cron是一个 Liunx 下 的定时执行工具,可以在无需人工干预的情况下运行作业。

service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态

crontab语法
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。/var/spool/cron下的crontab文件不可以直接创建或者直接修改。该crontab文件是通过crontab命令创建的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
backup_dir=/root/mysqlbackup
#日期
dd=date +%Y-%m-%d-%H-%M-%S
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=TankB214
#将要备份的数据库
database_name=edoctor

#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi

#简单写法 mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql
$tool -u u s e r n a m e − p username -p usernameppassword $database_name > b a c k u p d i r / backup_dir/ backupdir/database_name-$dd.sql

#写创建备份日志
echo “create b a c k u p _ d i r / backup\_dir/ backup_dir/database_name-$dd.dupm” >> $backup_dir/log.txt

#找出需要删除的备份
delfile=ls -l -crt $backup_dir/\*.sql | awk '{print $9 }' | head -1

#判断现在的备份数量是否大于$number
count=ls -l -crt $backup\_dir/\*.sql | awk '{print $9 }' | wc -l

if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo “delete $delfile” >> $backup_dir/log.txt
fi

如上代码主要含义如下:

1.首先设置各项参数,例如number最多需要备份的数目,备份路径,用户名,密码等。

2.执行mysqldump命令保存备份文件,并将操作打印至同目录下的log.txt中标记操作日志。

3.定义需要删除的文件:通过ls命令获取第九列,即文件名列,再通过实现定义操作时间最晚的那个需要删除的文件。

4.定义备份数量:通过ls命令加上wc -l统计以sql结尾的文件的行数。

5.如果文件超出限制大小,就删除最早创建的sql文件

使用crontab定期执行备份脚本
在 Linux 中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为“crontab”,是“cron table”的简写。

cron服务
cron是一个 Liunx 下 的定时执行工具,可以在无需人工干预的情况下运行作业。

service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态

crontab语法
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。/var/spool/cron下的crontab文件不可以直接创建或者直接修改。该crontab文件是通过crontab命令创建的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-zcnmjhCY-1713337599548)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2301_82257383/article/details/137874128

智能推荐

Hadoop+大数据的学习资料+实际项目+hadoop源码(中英双语)_hadoop大数据平台构建与应用 米洪 案例源码-程序员宅基地

文章浏览阅读703次,点赞2次,收藏3次。链接:https://pan.baidu.com/s/12l62pcm1ix0UgwKLb576aQ提取码:dcde喜欢点个赞_hadoop大数据平台构建与应用 米洪 案例源码

Go协程的底层原理(图文详解)

Go程序开发进阶保姆级教程,结合源码对Go协程的底层原理进行图文详解(为什么要有协程、协程的本质、协程是如何执行的、G-M-P调度模型、如何实现协程的并发、协程的抢占式调度)

aes解密流程图_(转)AES 加密算法的原理详解-程序员宅基地

文章浏览阅读1.9k次。(转)AES 加密算法的原理详解原文链接如下:AES简介高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:下面简单介绍下各个部分的作用与意义:明文P没有经过加密的数据。密钥K用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密..._aes cbc 原理图

Android如何使用XML自定义属性

在res/values文件下定义一个attrs.xml文件,代码如下:在布局中使用,示例代码如下:

Java OCR tesseract 图像智能字符识别技术 Java代码实现_tesocr jave-程序员宅基地

文章浏览阅读10w+次,点赞173次,收藏149次。接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码实现的,下面给大家分享下java实现的例子。拿代码扫描上面的图片,然后输出结果。主要思想就是利用Java调用系统任务。下面是核心代码:package com.zhy.test;import java.io.BufferedReader;import_tesocr jave

我用Python分析了1500家电商的销售数据,竟发现了进口车厘子的秘密_爬虫 淘宝车厘子-程序员宅基地

文章浏览阅读519次,点赞2次,收藏2次。图片来源:互联网众所周知,中国是智利车厘子最主要的出口对象,占据了其95%的市场份额。智利驻华大使馆商务参赞娜塔曾表示:“2020-2021产季车厘子实现了丰收,预计今年有50万吨左右的车厘子进入中国市场。”自2020年12月中旬开始,智利海运车厘子陆续到达中国,运输成本较此前空运方式大幅下滑。这意味着,国内消费者将能以更低的价格买到车厘子。然而,近日国内已有多地进口车厘子核酸检测结果为阳性,在这种情况下,你还敢大呼“车厘子自由”吗?01 数据获取本文利用Python采集了淘宝网1585.._爬虫 淘宝车厘子

随便推点

oracle tnslistener 无法启动,Oracle监听器服务不能启动的解决方法-程序员宅基地

文章浏览阅读2.2k次。Oracle监听器服务不启动的时候可采取以下措施予以解决:一、连接主机字符串,提示没有监听器SVRMGR> connect internal/oracle@orcl;ORA-12541: TNS:no listenerSVRMGR>二、运行监听器,提示地址的协议专用组件指定不正确在开始菜单运行中键入lsnrctlLSNRCTL for 32-bit Windows: Version 9..._error oracle tns listener

javaScript | 练习:给出一个数组,用循环遍历数组找出数组中的最大值和最小值 如:给出数组 let arr = [3, 6, 4, 8, 11, 90, 1]_遍历一个数组并找出数组中的最大值 和最小值js使用for循环-程序员宅基地

文章浏览阅读365次,点赞9次,收藏6次。最后,使用 `document.write()` 方法将计算出的最小值和最大值输出到网页上,并通过 `` 标签换行,以便清晰地显示两个不同的结果。- 接着,初始化了两个变量 `min` 和 `max`,它们分别用来存储数组中的最小值和最大值。初始值都设为数组的第一个元素 `arr[0]`。` 结构来分别比较当前遍历到的元素是否为数组中的最小值和最大值,并据此更新 `min` 和 `max` 变量。- 首先,使用 `new Array()` 创建了一个新的数组 `arr` 并初始化了其中的元素。_遍历一个数组并找出数组中的最大值 和最小值js使用for循环

react的事件机制(合成事件)_1. react 事件机制-程序员宅基地

文章浏览阅读158次。react的事件机制_1. react 事件机制

【LeetCode】(力扣) c/c++刷题-136.只出现一次的数字-程序员宅基地

文章浏览阅读50次。【代码】【LeetCode】(力扣) c/c++刷题-136.只出现一次的数字。

ACM的算法(觉得很好,有层次感)_前向星 acm算法与实现-程序员宅基地

文章浏览阅读644次。ACM的算法(觉得很好,有层次感)POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) _前向星 acm算法与实现

php笔记-程序员宅基地

文章浏览阅读57次。【1】windows下php运行环境安装【2】php连接MySQL【3】centos7下用yum的方式安装php7.2【4】编译式安装php【5】php日志文件【6】php.ini配置【7】php-fpm.conf重要参数详解【8】扩展mysql【1】windows下php运行环境安装参考连接#下载地址https://windows.php.net/download#php-7.3#解压安装包至任意目录#结合apache或nginx进行配置即可###名词解释...

推荐文章

热门文章

相关标签