MySQL中的备份和恢复

如何用mysql 命令进行备份和恢复?以test 库为例,创建一个备份,并再用此备份
进行恢复。

mysqldump -u root -p test > test.sql
mysql -u root -p test < test.sq

1、MySQL备份

**MySQL中的逻辑备份是将数据库中的数据备份为一个文本文件,备份的文件可以被查看和编辑。**在MySQL中,使用mysaldump工具来完成备份。有以下3种来调用mysqldump:

  1. 备份指定的数据库,或者此数据库中某些表
shell>mysqldump [option] db_name [tables]
  1. 备份指定的一个或多个数据库
shell>mysqldump [option] --database DB1 [DB2 DB3...]
  1. 备份所有数据库
shell>mysqldump [option] --all-database

如果没有指定数据库中的任何表,默认导出所有数据库中所有表。以下给出一些使用mysqldump工具进行备份的例子:

  1. 备份所有数据库
[cqh@localhost ~]$ mysqldump -uroot -p --all-database > all.sql
  1. 备份数据库test
[cqh@localhost ~]$ mysqldump -uroot -p test > test.sql
  1. 备份数据库test下的表emp
[cqh@localhost ~]$ mysqldump -uroot -p test emp > emp.sql
  1. 备份数据库test下的表emp和dept
[cqh@localhost ~]$ mysqldump -uroot -p test emp dept > emp_dept.sql
  1. 备份数据库test下的所有表为逗号分割的文本,备份到/tmp:
[cqh@localhost ~]$ mysqldump -uroot -p -T /tmp test emp --fields-terminated-by ','

2、MySQL恢复

MySQL中的恢复可分为三种,分别是:完全恢复、基于时间点恢复和基于位置恢复。

1. 完全恢复

mysqldump的恢复也很简单,将备份作为输入执行即可,具体语法如下:

mysql -uroot -p dbname < bakfile

注意,将备份恢复后数据并不完整,还需要将备份后执行的日志进行重做,语法如下:

mysqlbinlog binlog-file | mysql -uroot -p

2. 基于时间点恢复

由于误操作,比如误删除了一些表,这时使用完全恢复是没有用的,因为日志里还存在误操作的语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作语句,再恢复后面执行的语句,完成我们的恢复。这种恢复叫不完全恢复,在MySQL中,不完全恢复分别为基于时间点的恢复和基于位置的恢复。

以下是基于时间点恢复的操作步骤:

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

shell>mysqlbinlog --stop-date="20150929 9:59:59" /var/log/mysql/bin.123456 | mysql -uroot -pmypwd

跳过故障时的时间点,继续执行后面的BINLOG,完成恢复。

shell>mysqlbinlog --start-date="20150929 10:01:00" /var/log/mysql/bin.123456 | mysql -uroot -pmypwd \

3. 基于位置恢复

和基于时间点的恢复类似,但是更精确,因为同一个时间点可能有很多条SQL语句同时执行。恢复的操作步骤如下:

在shell下执行如下命令:

shell>mysqlbinlog --start-date="20150929 9:55:00" --stop-date="20150929 10:05:00" /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql

该命令将在/tmp目录创建小的文本文件,编辑此文件,找到出错语句前后的位置号,例如前后位置号分别是565512和565515

恢复了以前的备份文件后,应从命令行输入下面内容:

shell>mysqlbinlog--stop-position="551212"/var/log/mysql/bin.123456 | mysql -uroot -pmypwd
shell>mysqlbinlog--start-position="551215"/var/log/mysql/bin.123456 | mysql -uroot -pmypwd

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

3、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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.01 sec)

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

备库确认是否存在库cnfol:

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.格式化备库所在分区

[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

12.启动MySQL

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

$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)

4、MySQL定时全库备份

1. 备份脚本
在文件夹 /home/zqyu/database_bak 下创建脚本文件 db-backup.sh, 数据库账号是root,密码是123456, backupSize表示要保留的备份文件数量,备份 db_1,db_2,db_3三个数据库

#!/bin/bash
set -e

mhome=/home/zqyu/database_bak
today=$(date "+%Y%m%d_%H%M%S")
db_names=(db_1 db_2 db_3)

for db in ${db_names[@]}
do
    echo '备份数据库 '${db}' 中...'
    mkdir -p ${mhome}/${db}
    cd ${mhome}/${db}
    mysqldump -u root --password='123456' ${db} | gzip > ${mhome}/${db}/${today}.sql.tar.gz

    backupSize=30
    index=0
    for bak in $(ls -r)
    do
        if [ ${index} -ge ${backupSize} ]; then
            rm -f ${bak}
            # echo ${bak}
        fi
        index=$(expr ${index} + 1)
    done
done

2. 添加定时任务

$ crontab -e

添加定时任务,ESC 后 :wq保存

# 每天02:05备份一次数据库
05 02 * * * bash /home/zqyu/database_bak/db-backup.sh

5、MySQL备份与恢复:mysqldump/source命令 使用教程

MySQL备份与恢复也可理解为MySQL导出与导入。不管每个人怎么理解?这些都是我们经常需要用到的技术。这不,今天有一位朋友网站需要换服务器,域名不换,涉及到整站迁移,数据还挺大的,网站根目录下大小有9G,数据库data目录下大小有6G。

如果我们的数据比较小(几十M),我们可以很方便的使用phpMyAdmin的导入导出功能,由于我的数据库比较大(6G),用phpMyAdmin肯定是行不通了。我这个大小也算是“MySQL大数据量处理”了吧!因此,我就用了MySQL自带的:mysqldump命令。

一、mysqldump 简介
mysqldump 是 MySQL 自带的逻辑备份工具。

它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。

二、MySQL”备份/导出“命令:mysqldump
如果是Linux,就要进入MySQL安装目录,执行:mysqldump 命令。

如果是Windows,就要进入MySQL安装目录, cmd窗口执行:mysqldump.exe 命令。
MySQL中的备份和恢复_第1张图片
mysqldump 使用示例:

备份所有数据库:

mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db

备份指定数据库:

mysqldump -uroot -p test > /backup/mysqldump/test.db

备份指定数据库指定表(多个表以空格间隔)

mysqldump -uroot -p mysql db event > /backup/mysqldump/2table.db

备份指定数据库排除某些表

mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.db

三、MySQL”恢复/还原“命令: source

MySQL”恢复/还原“其实有两种操作方法吧!既然都说到这里了,我就分别给大家都分享一下!对于有基础的朋友来说,都是非常的简单易懂。具体如下:

1、系统行命令

mysqladmin -uroot -p create db_name 
mysql -uroot -p db_name < /backup/mysqldump/db_name.db

注意:在导入备份数据库前,db_name 如果没有,是需要创建的; 而且与db_name.db中数据库名是一样的才可以导入。所以,这里我首先用了 mysqladmin 创建了一个 db_name 数据库。

2、soure 方法

mysql > use db_name
mysql > source /backup/mysqldump/db_name.db

总结:

MySQL备份还可以通过“复制表文件”进行备份。可以通过复制表文件(.MYD,.MYI文件和关联*.sdi文件)来备份MyISAM表。要获得一致的备份,请停止服务器或锁定并刷新相关表:

FLUSH TABLES tbl_list WITH READ LOCK;

您只需要一个读锁;

这样,当您在数据库目录中复制文件时,其他客户端就可以继续查询表。需要刷新才能确保在开始备份之前将所有活动索引页都写入磁盘。

解锁的语句用:UNLOCK TABLES;

6、Mysqldump常用的备份命令

1)导出所有的数据库(库/表结构/数据)

mysqldump -uroot -proot --all-databases > fullbak.sql

2)导出所有的数据库(库/表结构,但不包括数据)

mysqldump -uroot -proot --all-databases --no-data > fullbak.sql

3)只导出某一个表(结构+数据:commany.user)

mysqldump -uroot -proot commany user > fullbak.sql
  1. 只导出某一个表(结构,不包括数据:commany.user)
mysqldum -uroot -proot --no-data commany user >fullbak.sql

5)导出多个表(结构+数据: commany.user ,commany.dept)

mysqldum -uroot -proot --no-data commany user dept >fullbak.sql

6)在备份的时候不创建表结构

mysqldum -uroot -proot --no-create-info commany user >fullbak.sql
or:查看备份的结构
select * from commany.user into outfile 'fullbak.sql'

7)导出单个数据库(结构+数据)

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

8)导出多个数据库(结构+数据)

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是目前首选的备份方案之一

原理

MySQL中的备份和恢复_第2张图片
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.

MySQL中的备份和恢复_第3张图片
备份一个表

# 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 $username -p$password $database_name > $backup_dir/$database_name-$dd.sql

#写创建备份日志
echo "create $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命令创建的。

在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。

格式如下:

minute hour day-of-month month-of-year day-of-week commands 
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) 

除了数字还有几个个特殊的符号就是"*""/""-"","*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

-l 在标准输出上显示当前的crontab。 
-r 删除当前的crontab文件。 
-e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。 

创建cron脚本

  • 第一步:写cron脚本文件,命名为mysqlRollBack.cron。15,30,45,59 * * * * echo
    “xgmtest…” >> xgmtest.txt 表示,每隔15分钟,执行打印一次命令
  • 第二步:添加定时任务。执行命令 “crontab crontest.cron”。搞定
  • 第三步:“crontab -l” 查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本

注意:这操作是直接替换该用户下的crontab,而不是新增

定期执行编写的定时任务脚本(记得先给shell脚本执行权限)

0 2 * * * /root/mysql_backup_script.sh

随后使用crontab命令定期指令编写的定时脚本

crontab mysqlRollback.cron

再通过命令检查定时任务是否已创建:

附 crontab 的使用示例:
1.每天早上6点

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

2.每两个小时

0 */2 * * * echo "Have a break now." >> /tmp/test.txt

3.晚上11点到早上8点之间每两个小时和早上八点

0 23-7/28 * * * echo "Have a good dream" >> /tmp/test.txt

4.每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3 command line

5.1月1日早上4点

0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/

6.每小时执行/etc/cron.hourly内的脚本

01 * * * * root run-parts /etc/cron.hourly

7.每天执行/etc/cron.daily内的脚本

02 4 * * * root run-parts /etc/cron.daily

8.每星期执行/etc/cron.weekly内的脚本

22 4 * * 0 root run-parts /etc/cron.weekly

9.每月去执行/etc/cron.monthly内的脚本

42 4 1 * * root run-parts /etc/cron.monthly

注意: “run-parts” 这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。

10.每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。

51525354555 161718 * * * command

11.每周一,三,五的下午3:00系统进入维护状态,重新启动系统。

00 15 * * 135 shutdown -r +5

12.每小时的10分,40分执行用户目录下的innd/bbslin这个指令:

1040 * * * * innd/bbslink

13.每小时的1分执行用户目录下的bin/account这个指令:

1 * * * * bin/account

以下是我的测试每分钟的截图效果,其对应代码如下:

* * * * * /root/mysql_backup_script.sh





扩展

FAQ
1、可能报错1

Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.
 

BEGIN failed--compilation aborted at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.

解决方案:

.pm实际上是Perl的包,只需安装perl-Time-HiRes即可:

[root@test-huanqiu percona-xtrabackup-2.1.9]# yum install -y perl-Time-HiRes

2、可能报错2

Can't locate DBI.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.
BEGIN failed--compilation aborted at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.

报错原因:系统没有按安装DBI组件。

DBI(Database Interface)是perl连接数据库的接口。其是perl连接数据库的最优秀方法,他支持包括Orcal,Sybase,mysql,db2等绝大多数的数据库。

解决办法:

安装DBI组件(Can't locate DBI.pm in @INC-mysql接口)

或者单独装DBI、Data-ShowTable、DBD-mysql 三个组件

[root@test-huanqiu percona-xtrabackup-2.1.9]# yum -y install perl-DBD-MySQL
接着使用innobackupex命令测试是否正常

[root@test-huanqiu percona-xtrabackup-2.1.9]# innobackupex --help
Options:
--apply-log
Prepare a backup in BACKUP-DIR by applying the transaction log file
named "xtrabackup_logfile" located in the same directory. Also,
create new transaction logs. The InnoDB configuration is read from
the file "backup-my.cnf".

--compact
Create a compact backup with all secondary index pages omitted. This
option is passed directly to xtrabackup. See xtrabackup
documentation for details.

--compress
This option instructs xtrabackup to compress backup copies of InnoDB
data files. It is passed directly to the xtrabackup child process.
Try 'xtrabackup --help' for more details.

3、可能报错3

161130 05:56:48 innobackupex: Connecting to MySQL server with DSN ‘dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup’ as ‘root’ (using password: YES).
innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 2956.

解决办法:

[root@test-huanqiu ~]# yum -y install perl-DBD-MySQL.x86_64
......
Package perl-DBD-MySQL-4.013-3.el6.x86_64 already installed and latest version //发现本机已经安装了

[root@test-huanqiu ~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
发现本机已经安装了最新版的perl-DBD-MYSQL了,但是仍然报出上面的错误!! 莫慌~~继续下面的操作进行问题的解决

查看mysql.so依赖的lib库

[root@test-huanqiu ~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffd291fc000)
libmysqlclient.so.16 => not found //这一项为通过检查,缺失libmysqlclient.so.16库导致
libz.so.1 => /lib64/libz.so.1 (0x00007f78ff9de000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f78ff7a7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f78ff58e000)
libm.so.6 => /lib64/libm.so.6 (0x00007f78ff309000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f78ff09d000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f78fecb9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f78fe924000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f78fe721000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f78fe4dd000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f78fe1f5000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f78fdff1000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f78fddc5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f78fdbc0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78ffe1d000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f78fd9b5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f78fd7b2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f78fd597000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f78fd37a000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f78fd15a000)
以上结果说明缺少libmysqlclient.so.16这个二进制包,找个官方原版的mysql的libmysqlclient.so.16替换了即可!

[root@test-huanqiu~]# find / -name libmysqlclient.so.16 //查看本机并没有libmysqlclient.so.16库文件
查看mysql/lib下的libmysqlclinet.so库文件

[root@test-huanqiu~]# ll /usr/local/mysql/lib/
total 234596
-rw-r--r--. 1 mysql mysql 19520800 Nov 29 12:27 libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 16 Nov 29 12:34 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 17 Nov 29 12:34 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x. 1 mysql mysql 8858235 Nov 29 12:27 libmysqlclient.so.18.1.0
-rw-r--r--. 1 mysql mysql 211822074 Nov 29 12:34 libmysqld.a
-rw-r--r--. 1 mysql mysql 14270 Nov 29 12:27 libmysqlservices.a
drwxr-xr-x. 3 mysql mysql 4096 Nov 29 12:34 plugin
将mysql/lib/libmysqlclient.so.18.1.0库文件拷贝到/lib64下,拷贝后命名为libmysqlclient.so.16

[root@test-huanqiu~]# cp /usr/local/mysql/lib/libmysqlclient.so.18.1.0 /lib64/libmysqlclient.so.16

[root@test-huanqiu~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/
/lib64/
[root@test-huanqiu~]# ldconfig

最后卸载perl-DBD-MySQL,并重新安装perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
[root@test-huanqiu~]# rpm -e --nodeps perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
[root@test-huanqiu~]# yum -y install perl-DBD-MySQL
待重新安装后,再次重新检查mysql.so依赖的lib库,发现已经都通过了

[root@test-huanqiu~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffe3669b000)
libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007f4af5c25000)
libz.so.1 => /lib64/libz.so.1 (0x00007f4af5a0f000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f4af57d7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f4af55be000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4af533a000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4af50cd000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4af4ce9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4af4955000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f4af4751000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f4af450d000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f4af4226000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f4af4021000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f4af3df5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4af3bf1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4af61d1000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f4af39e5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f4af37e2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f4af35c8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4af33aa000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4af318b000)

4、可能报错4
sh: xtrabackup_56: command not found

innobackupex: Error: no ‘mysqld’ group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.
有可能是percona-xtrabackup编译安装后,在编译目录的src下存在xtrabackup_innodb55,只需要其更名为xtrabackup_55,然后拷贝到上面的/home/mysql/admin/bin/percona-xtrabackup-2.1.9/下即可!

参连接:
http://www.yunweipai.com/13462.html

8、【MySQL】通过SQL_Thread快速恢复binlog

常见binlog增量恢复方式

先解析成sql文件,再导入MySQL

mysqlbinlog mysql-bin.000001 --start-position=n > /data/add.sql
mysqlbinlog mysql-bin.000002 ... mysql-bin.n >> /data/add.sql
mysql -u -p -S < /data/add.sql

直接管道到MySQL中

mysqlbinlog mysql-bin.000001 --start-position=n | mysql -u -p -S
mysqlbinlog mysql-bin.000002 ... mysql-bin.n | mysql -u -p -S

直接管道进去的方式,并不一定安全,手册上也有指明:

If you have more than one binary log to execute on the MySQL server,
the safe method is to process them all using a single connection to the server.

关于这种方式的更多内容,可以参考:
https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html

然而这两种方式原理都是一样的,通过mysqlbinlog解析成sql并导入到MySQL中。

优点:

  • 操作方便,逻辑简单。
  • 无需关闭mysqld。
    缺点:
  • 遇到ERROR难以定位位置,难以“断点恢复”。
  • 特殊字符或字符集的问题。
  • max_allowed_packet问题。
  • 恢复速度慢。

迁移MySQL数据库

第一步 - 执行MySQL转储
在将数据库文件传输到新的VPS之前,我们首先需要使用mysqldump命令在原始虚拟服务器上备份它。

mysqldump -u root -p --opt [database name] > [database name].sql

执行转储后,即可准备传输数据库。

第二步 - 复制数据库
SCP帮助您复制数据库。 如果使用上一个命令,则将数据库导出到主文件夹。

SCP命令具有以下语法:

scp [database name].sql [username]@[servername]:path/to/database/

样本传输可能如下所示:

scp newdatabase.sql [email protected]:~/

连接后,数据库将传输到新的虚拟专用服务器。

第三步:导入数据库
一旦数据已传输到新服务器,您可以将数据库导入MySQL:

mysql -u root -p newdatabase 

With that, your transfer via SCP will be complete. 

By Etel Sverdlov

这样,您通过SCP转移将完成。

# ERROR at line 79: Unknown command '\0'.
使用mysqldump -uroot -p123456 databases > /home/databases.sql 进行备份

在使用mysql -uroot -p123456 databases  < /home/databases.sql 进行mysql恢复的时候,出现如下报错。

ERROR at line 79: Unknown command ‘\0’.

上述错误,是因为导出时字符集的问题,解决方法如下:--default-character-set=utf8

在导入时加上mysql -uroot -p123456 --default-character-set=utf8 databases  < /home/databases.sql ,就可以了。

参考链接 :
https://www.cnblogs.com/lms0755/p/9205642.html

Mysqldump常用的备份命令 : https://mp.weixin.qq.com/s/4NChb8O7ebWTZK_aMzoiaA

MySQL定时全库备份https://www.jianshu.com/p/b317c62cb17a

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

【MySQL】通过SQL_Thread快速恢复binlog :https://mp.weixin.qq.com/s/Y9wR2Y4sp6NVGyjePMQPfQ

MySQL备份与恢复:mysqldump/source命令 使用教程 : https://www.fujieace.com/mysql/mysqldump-source.html

Mysqldump常用的备份命令 : https://mp.weixin.qq.com/s/4NChb8O7ebWTZK_aMzoiaA

MySQL实时在线备份恢复方案 : https://mp.weixin.qq.com/s/Lig6mdtgagVrYoC5LC2gAA

链接:https://www.jianshu.com/p/8315e2dffc5b

案例:教你迁移MySQL数据库 https://www.jianshu.com/p/3e1c718cb912

MySQL 数据库定时备份的几种方式(非常全面) :https://mp.weixin.qq.com/s/8yeH3ooKW8sKVPEEANHCYA

你可能感兴趣的:(数据库,mysql,数据库,sql)