多种方式备份mariadb(1)

在使用数据库的时候首先考虑的就是:当出现灾难时候是否能够进行灾难恢复?其中的灾难包括:误操作、硬件故障、软件故障、自然灾害、黑客攻击。当然误操作和硬件软件故障占据首位。所以说你的数据库需要进行备份,这个太重要了!因为硬件设施有价,数据是无价的。没有数据对于企业来说是一种毁灭性打击!

不过备份mariadb有多种办法,我们要注意下面的要点来选用我们需要使用的工具来对mariadb进行备份:

  • 能容忍最多丢失多少数据?
  • 恢复数据要在多长时间完成?
  • 需要恢复哪些数据?(包括配置文件)
  • 平时应该进行如下操作:
    (1)做还原测试,用于测试备份的可用性
    (2)还原演练
除此之外还得了解备份类型:

备份类型分为两种:

(1)完全备份:备份整个数据库
(2)部分备份:只备份数据子集

在部分备份中还分为:

(1)增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据。
back_up_mariadb01
(2)差异备份:仅备份最近一次完全备份以来变化的数据。
back_up_mariadb02注:完全备份可以和增量备份或者差异备份同时使用,但是增量备份不能和差异备份同时使用。

备份类型考虑完毕还需考虑备份过程的方式,备份方式有:

热备份:备份过程中读写操作均可进行。
温备份:备份过程中读操作可以进行,而会关闭写操作。
冷备份:备份过程中读写操作都不予进行。

备份方式有以上三种,不过对于不同的mariadb的存储引擎可以使用的方式也不同:

MyISAM:仅支持温备和冷备!
InnoDB:支持以上所有的方式。

最后我们还需要考虑备份使用的工具,工具有以下几种:

(1)mysqldump :逻辑备份工具,适用于所有存储引擎;温备:完全备份、部分备份:对InnDB存储引擎支持热备份。如果需要进行增量备份可以使用复制binlog中的enent方式来进行。
(2)cp,tar等赋值归档工具:物理备份工具,适用于所有存储引擎;冷备、完全备份、部分备份。对我来说不是非常推荐。因为是冷备份,但是使用拷贝的方式可以完好的复制所有数据!
(3)LVM2的快照:几乎热备;备份借助于文件系统管理工具进行备份。如果需要进行增量备份和mysqldump一样复制binglog中指定时间范围的event,达到增量备份。
(4)最后介绍高级工具:xtrabackup 由percona提供的支持对InnDB做热备(物理备份)的工具;可以完全备份、增量备份。

首先我还是先说说使用cp、tar等工具对mariadb进行备份处理:

我将网站以前的数据库导入了下来然后安装在我测试的主机上给大家演示:

MariaDB [(none)] SHOW DATABASES; 
#查看数据库,其中的wordpress就是我的数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]USE wordpress;
#使用这个数据库看看
Database changed
MariaDB [wordpress]SHOW TABLES;
#查看数据库中有哪些表
 -> ;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.00 sec)

接下来看是进行使用cp进行备份!

MariaDB [wordpress]> FLUSH TABLES WITH READ LOCK; 
#向所有表增加读锁
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# mkdir /var/back 
#创建一个恢复备份的文件
[root@localhost ~]# cd /var
[root@localhost var]# cd data 
#/var/data为数据库文件存放的目录
[root@localhost data]# ll
total 179448
-rw-rw---- 1 mysql mysql 16384 Jul 13 06:30 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Jul 13 06:30 aria_log_control
-rw-rw---- 1 mysql mysql 79691776 Jul 18 08:52 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Jul 18 08:52 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Jul 13 03:21 ib_logfile1
-rw-rw---- 1 mysql mysql 5 Jul 18 08:52 localhost.localdomain.pid
-rw-rw---- 1 mysql mysql 0 Jul 13 03:33 multi-master.info
drwx------ 2 mysql root 4096 Jul 13 03:21 mysql
-rw-rw---- 1 mysql mysql 654 Jul 13 06:09 mysql-bin.000001
-rw-rw---- 1 mysql mysql 3341325 Jul 13 06:30 mysql-bin.000002
-rw-rw---- 1 mysql mysql 326 Jul 18 08:52 mysql-bin.000003
-rw-rw---- 1 mysql mysql 57 Jul 18 08:52 mysql-bin.index
drwx------ 2 mysql mysql 4096 Jul 13 03:21 performance_schema
drwx------ 2 mysql root 4096 Jul 13 03:21 test
drwx------ 2 mysql mysql 4096 Jul 13 06:17 wordpress
[root@localhost data]# cd wordpress/
[root@localhost wordpress]# ll 
#这个是wordpress库中的文件
total 10760
-rw-rw---- 1 mysql mysql 65 Jul 13 06:07 db.opt
-rw-rw---- 1 mysql mysql 3033 Jul 13 06:17 wp_commentmeta.frm
-rw-rw---- 1 mysql mysql 131072 Jul 13 06:17 wp_commentmeta.ibd
-rw-rw---- 1 mysql mysql 6685 Jul 13 06:17 wp_comments.frm
-rw-rw---- 1 mysql mysql 180224 Jul 13 06:17 wp_comments.ibd
-rw-rw---- 1 mysql mysql 8105 Jul 13 06:17 wp_links.frm
-rw-rw---- 1 mysql mysql 114688 Jul 13 06:17 wp_links.ibd
-rw-rw---- 1 mysql mysql 2365 Jul 13 06:17 wp_options.frm
-rw-rw---- 1 mysql mysql 9437184 Jul 13 06:18 wp_options.ibd
-rw-rw---- 1 mysql mysql 3030 Jul 13 06:17 wp_postmeta.frm
-rw-rw---- 1 mysql mysql 131072 Jul 13 06:17 wp_postmeta.ibd
-rw-rw---- 1 mysql mysql 6282 Jul 13 06:17 wp_posts.frm
-rw-rw---- 1 mysql mysql 163840 Jul 13 06:18 wp_posts.ibd
-rw-rw---- 1 mysql mysql 3030 Jul 13 06:17 wp_termmeta.frm
-rw-rw---- 1 mysql mysql 131072 Jul 13 06:17 wp_termmeta.ibd
-rw-rw---- 1 mysql mysql 1496 Jul 13 06:17 wp_term_relationships.frm
-rw-rw---- 1 mysql mysql 114688 Jul 13 06:17 wp_term_relationships.ibd
-rw-rw---- 1 mysql mysql 3592 Jul 13 06:17 wp_terms.frm
-rw-rw---- 1 mysql mysql 131072 Jul 13 06:17 wp_terms.ibd
-rw-rw---- 1 mysql mysql 2209 Jul 13 06:17 wp_term_taxonomy.frm
-rw-rw---- 1 mysql mysql 131072 Jul 13 06:17 wp_term_taxonomy.ibd
-rw-rw---- 1 mysql mysql 3031 Jul 13 06:17 wp_usermeta.frm
-rw-rw---- 1 mysql mysql 131072 Jul 13 06:18 wp_usermeta.ibd
-rw-rw---- 1 mysql mysql 6965 Jul 13 06:17 wp_users.frm
-rw-rw---- 1 mysql mysql 147456 Jul 13 06:17 wp_users.ibd
[root@localhost wordpress]# cd ..
[root@localhost data]# cp -R * /var/back/ 
#将数据库目录下的所有文件拷贝到备份的目录

接下来我们假设硬件RAID5硬盘损坏两块导致数据库文件全部丢失,我们如何恢复:

[root@localhost var]# cd data #首先我们进入/var/data
[root@localhost data]# rm -rf ./* #然后删除所有文件
[root@localhost data]# systemctl restart mysqld #重启mariadb的服务
[root@localhost data]# mysql
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)
#看到了不?数据库全部消失!
[root@localhost var]# alias 
#在恢复之前首先我们要将cp的别名给去除不然会发生让你悲催的事情!
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost var]# unalias cp
[root@localhost var]# cp -rf back/* data/ 
#随后我们将back目录中的所有内容拷贝到data目录中
[root@localhost var]# cd data
[root@localhost data]# ll
total 179448
-rw-rw---- 1 mysql mysql 16384 Jul 18 10:58 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Jul 18 10:58 aria_log_control
drwx------ 2 root root 4096 Jul 18 10:58 cookiesinn
-rw-rw---- 1 mysql mysql 79691776 Jul 18 10:58 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Jul 18 10:58 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Jul 18 10:58 ib_logfile1
-rw-r----- 1 root root 5 Jul 18 10:58 localhost.localdomain.pid
-rw-r----- 1 root root 0 Jul 18 10:58 multi-master.info
drwx------ 2 root root 4096 Jul 18 10:58 mysql
-rw-rw---- 1 mysql mysql 654 Jul 18 10:58 mysql-bin.000001
-rw-r----- 1 root root 3341325 Jul 18 10:58 mysql-bin.000002
-rw-r----- 1 root root 326 Jul 18 10:58 mysql-bin.000003
-rw-rw---- 1 mysql mysql 57 Jul 18 10:58 mysql-bin.index
-rw-rw---- 1 mysql mysql 0 Jul 18 10:50 mysql-bin.state
drwx------ 2 root root 4096 Jul 18 10:58 performance_schema
drwx------ 2 root root 4096 Jul 18 10:58 test
drwx------ 2 root root 4096 Jul 18 10:58 wordpress
[root@localhost data]# systemctl restart mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
#启动失败我们来看看为啥?
[root@localhost data]# systemctl status mysqld
● mysqld.service - LSB: start and stop MySQL
 Loaded: loaded (/etc/rc.d/init.d/mysqld)
 Active: failed (Result: exit-code) since Mon 2016-07-18 10:59:28 CST; 18s ago
 Docs: man:systemd-sysv-generator(8)
 Process: 7040 ExecStop=/etc/rc.d/init.d/mysqld stop (code=exited, status=0/SUCCESS)
 Process: 7062 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)

Jul 18 10:59:25 localhost.localdomain systemd[1]: Starting LSB: start and stop MySQL...
Jul 18 10:59:28 localhost.localdomain mysqld[7062]: Starting MySQL... ERROR!
Jul 18 10:59:28 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited s...s=1
Jul 18 10:59:28 localhost.localdomain systemd[1]: Failed to start LSB: start and stop MySQL.
Jul 18 10:59:28 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
Jul 18 10:59:28 localhost.localdomain systemd[1]: mysqld.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
#本身我还以为是pid文件问题,后来看了data下面文件的属组属主才知道是个啥问题!
[root@localhost data]# chown -R mysql:mysql ./* 
#更改属组属主
[root@localhost data]# systemctl start mysqld
[root@localhost data]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.0.24-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES; 
#再次查看数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> USE wordpress
Database changed
MariaDB [wordpress]> SHOW TABLES; 
#使用wordpress数据库查看表
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.00 sec)
#功能都是好好的没缺东西!
接下来我来说说使用mysqldump+cp二进制日志文件来实现完全备份和增量备份:
#首先我就不看数据库了,就是刚刚的那个。我直接跳到如何备份数据库:
MariaDB [(none)]> SHOW MASTER STATUS; 
#如果需要使用增量备份就需要首先记住二进制日志文件的所在的Position
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 326 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[root@localhost data]# mysqldump -B wordpress > /root/wordpress.sql 
#执行备份操作。-B表示备份指定数据库,恢复时不用指明数据库名称!
#命令常用的三种模式:
mysqldump [OPTIONS] db_name [tb1_name......] #备份库中的表,恢复时需要自己创建表。
mysqldump [OPTIONS] --databases | -B db_name...... #备份整个指定的库,恢复时自动创建。
mysqldump [OPTIONS] --all-databases | -A #备份所有数据库,恢复时所有库自动创建。
MariaDB [(none)]> CREATE DATABASE hello; #创建一个数据库作为让二进制日志文件进行恢复
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| hello |
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> SHOW MASTER STATUS; #再次记住Position的位置
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 449 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[root@localhost ~]# rm -rf /var/data/wordpress 
#删除两个数据库或者在数据库中DROP掉两个数据库!
[root@localhost ~]# rm -rf /var/data/hello/
[root@localhost ~]# systemctl restart mysqld 
#重启mysqld
MariaDB [(none)]> SHOW DATABASES; 
#数据库没了
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
[root@localhost ~]# mysql < wordpress.sql 
#我当时备份wordpress库放在了/root目录中直接使用导入即可
[root@localhost ~]# mysql 
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.0.24-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES; #查看数据库中是否有wordpress?
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> USE wordpress;
Database changed
MariaDB [wordpress]> SHOW TABLES; 
#数据库中的表又回来了!
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --start-position=326 --stop-position=449 /var/data/mysql-bin.000004 | mysql wordpress 
#使用二进制日志文件恢复,写入启示position和终止postition你看刚刚让你们记下数字很重要吧?然后找到对应的二进制日志文件,通过管道交给wordpress的数据库
[root@localhost data]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 15
Server version: 10.0.24-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| hello |
| information_schema |
| mysql |
| performance_schema |
| test |
| wordpress |
+--------------------+
6 rows in set (0.00 sec)
#你看test回来了!

好了,这一期好像说的很长了,下次我们来看看后面两种的备份方法!

Comments

Leave a Reply

Your email address will not be published. Name and email are required