博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ProxySQL备份策略
阅读量:2195 次
发布时间:2019-05-02

本文共 10802 字,大约阅读时间需要 36 分钟。

介绍

我们深知ProxySQL是MySQL的领先SQL感知代理之一。 在本博客中,我将解释ProxySQL的备份和还原策略。 我认为,关于该主题的博客仍然结构不完善。

如果您正在寻找我们的ProxySQL系列的其他文章:

ProxySQL真的需要备份吗?

  • 您已经在单个ProxySQL下配置了产品服务器。 有人在AWS控制台中意外终止了代理服务器,现在真的需要ProxySQL备份吗?
  • 您有来自DEV团队的请求,要使用现有的相同配置再构建一个ProxySQL,您准备好手动执行新ProxySQL设置配置的所有命令(复杂规则)了吗?
  • 意外地,您的DC崩溃了,您需要在其他DC中构建ProxySQL,您将如何在短时间内做到这一点?

ProxySQL备份策略–

作为一名DBA,我认为以下四种策略在备份ProxySQL方面起着至关重要的作用。

  • sqlite3备份
  • 物理快照
  • 配置文件备份
  • mysqldump

在进入本主题之前,我将简要介绍一下我的测试环境。 我在ProxySQL中配置了5台服务器(1个主服务器3个从属服务器1个备份节点)。

Master:192.168.33.25

Slaves:192.168.33.26,192.168.33.27,192.168.33.28

Backup:192.168.33.29

mysql> select hostgroup_id,hostname,port,status,comment from mysql_servers;+--------------+---------------+------+--------+---------+| hostgroup_id | hostname      | port | status | comment |+--------------+---------------+------+--------+---------+| 100          | 192.168.33.25 | 3306 | ONLINE | master  || 100          | 192.168.33.26 | 3306 | ONLINE | slave1  || 100          | 192.168.33.27 | 3306 | ONLINE | slave2  || 100          | 192.168.33.28 | 3306 | ONLINE | slave3  || 100          | 192.168.33.29 | 3306 | ONLINE | backup  |+--------------+---------------+------+--------+---------+5 rows in set (0.00 sec)

让我们进入实际实验

Sqlite3 backup

Sqlite是ProxySQL的后端数据库。 Sqlite3是用于在Sqlite数据库上执行备份的客户端工具。 这也有助于查看数据文件中的可用内容,而无需还原备份。

Example

[root@mydbopslabs25 proxysql]# ls /var/lib/proxysql/mysql_server.sql  proxysql.db proxysql.log  proxysql.pid proxysql_stats.db[root@mydbopslabs25 proxysql]# sqlite3 proxysql.db SQLite version 3.7.17 2013-05-20 00:56:22Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite> select * from mysql_servers;100|192.168.33.25|3306|ONLINE|1|0|1000|0|0|0|master100|192.168.33.26|3306|ONLINE|1|0|1000|0|0|0|slave1100|192.168.33.27|3306|ONLINE|1|0|1000|0|0|0|slave2100|192.168.33.28|3306|ONLINE|1|0|1000|0|0|0|slave3100|192.168.33.29|3306|ONLINE|1|0|1000|0|0|0|backupsqlite> .quit

以下是使用Sqlite3执行逻辑备份和还原的过程。

cmd -[root@mydbopslabs25 proxysql]# sqlite3 proxysql.db .dump > data.sql Backup file output -[root@mydbopslabs25 proxysql]# cat data.sql | head -n5PRAGMA foreign_keys=OFF;BEGIN TRANSACTION;CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) );INSERT INTO "mysql_servers" VALUES(100,'192.168.33.25',3306,'ONLINE',1,0,1000,0,0,0,'master');INSERT INTO "mysql_servers" VALUES(100,'192.168.33.26',3306,'ONLINE',1,0,1000,0,0,0,'slave1');

备份还原

[root@mydbopslabs25 proxysql]# mv data.sql /[root@mydbopslabs25 proxysql]# service proxysql stopShutting down ProxySQL: DONE![root@mydbopslabs25 proxysql]# sqlite3 /var/lib/proxysql/proxysql.db < /data.sql [root@mydbopslabs25 proxysql]# [root@mydbopslabs25 proxysql]# service proxysql startStarting ProxySQL: 2019-05-02 20:51:46 [INFO] Using config file /etc/proxysql.cnfDONE![root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;"+--------------+---------------+------+--------+---------+| hostgroup_id | hostname      | port | status | comment |+--------------+---------------+------+--------+---------+| 100          | 192.168.33.25 | 3306 | ONLINE | master  || 100          | 192.168.33.26 | 3306 | ONLINE | slave1  || 100          | 192.168.33.27 | 3306 | ONLINE | slave2  || 100          | 192.168.33.28 | 3306 | ONLINE | slave3  || 100          | 192.168.33.29 | 3306 | ONLINE | backup  |+--------------+---------------+------+--------+---------+

是的,它运行正常。 这是一个逻辑备份,我们可以在RUNTIME上使用此方法而无需关闭ProxySQL。

Physical snapshot

这是我们用来进行冷备份的常用方法。 以下是此备份过程中涉及的步骤。

  • 关闭ProxySQL
  • 拷贝data directory到备份目录
  • 启动ProxySQL
[root@mydbopslabs25 proxysql]# pwd/var/lib/proxysql[root@mydbopslabs25 proxysql]# service proxysql stopShutting down ProxySQL: DONE![root@mydbopslabs25 proxysql]# cp -r /var/lib/proxysql/* /backup_snapshot/[root@mydbopslabs25 proxysql]# service proxysql startStarting ProxySQL: 2019-05-02 20:59:33 [INFO] Using config file /etc/proxysql.cnfDONE![root@mydbopslabs25 proxysql]# ls -lrth /backup_snapshot/total 168K-rw------- 1 root root 108K May  2 20:59 proxysql_stats.db-rw------- 1 root root  15K May 2 20:59 proxysql.log-rw-r--r-- 1 root root  42K May 2 20:59 proxysql.db

下面的步骤是恢复过程

[root@mydbopslabs25 proxysql]# service proxysql stopShutting down ProxySQL: DONE![root@mydbopslabs25 proxysql]# pwd/var/lib/proxysql[root@mydbopslabs25 proxysql]# rm -rf /var/lib/proxysql/*[root@mydbopslabs25 proxysql]# cp -r /backup_snapshot/* /var/lib/proxysql/[root@mydbopslabs25 proxysql]# chown -R proxysql:proxysql /var/lib/proxysql/[root@mydbopslabs25 proxysql]# ls -lrthtotal 168K-rw------- 1 proxysql proxysql  15K May 2 21:02 proxysql.log-rw-r--r-- 1 proxysql proxysql  42K May 2 21:02 proxysql.db-rw------- 1 proxysql proxysql 108K May  2 21:02 proxysql_stats.db[root@mydbopslabs25 proxysql]# service proxysql startStarting ProxySQL: 2019-05-02 21:03:02 [INFO] Using config file /etc/proxysql.cnfDONE![root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;"+--------------+---------------+------+--------+---------+| hostgroup_id | hostname      | port | status | comment |+--------------+---------------+------+--------+---------+| 100          | 192.168.33.25 | 3306 | ONLINE | master  || 100          | 192.168.33.26 | 3306 | ONLINE | slave   || 100          | 192.168.33.27 | 3306 | ONLINE | slave1  || 100          | 192.168.33.28 | 3306 | ONLINE | slave2  || 100          | 192.168.33.29 | 3306 | ONLINE | backup  |+--------------+---------------+------+--------+---------+

在不停止ProxySQL的情况下拍摄快照可能会导致备份损坏。

注意:确保以相同的ProxySQL版本还原备份,以避免架构结构上的冲突。

Config file backup

我个人非常喜欢这种备份方法。 ProxySQL提供了我们可以在运行时完成的最大配置,而无需重新启动ProxySQL。 无需配置文件条目。 但是,每当在ProxySQL中进行更改时,我建议也将这些条目添加到ProxySQL配置文件中,并进行备份。

这是我的备份ProxySQL配置文件,我在“ / etc /”下添加了

cat /etc/proxysql.cnf..mysql_servers =(        { address="192.168.33.25" , port=3306 , hostgroup=100, status="ONLINE", comment="master" },        { address="192.168.33.26" , port=3306 , hostgroup=100, status="ONLINE", comment="slave1" },        { address="192.168.33.27" , port=3306 , hostgroup=100, status="ONLINE", comment="slave2" },        { address="192.168.33.28" , port=3306 , hostgroup=100, status="ONLINE", comment="slave3" },        { address="192.168.33.29" , port=3306 , hostgroup=100, status="ONLINE", comment="backup" }):

现在,我将使用更新的配置文件启动ProxySQL,

#Linux shell [root@mydbopslabs25 proxysql]# service proxysql start Starting ProxySQL: 2019-05-03 00:02:01 [INFO] Using config file /etc/proxysql.cnf DONE! [root@mydbopslabs25 proxysql]# ls [root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;" +--------------+---------------+------+--------+---------+| hostgroup_id | hostname      | port | status | comment |+--------------+---------------+------+--------+---------+| 100          | 192.168.33.25 | 3306 | ONLINE | master  || 100          | 192.168.33.26 | 3306 | ONLINE | slave   || 100          | 192.168.33.27 | 3306 | ONLINE | slave1  || 100          | 192.168.33.28 | 3306 | ONLINE | slave2  || 100          | 192.168.33.29 | 3306 | ONLINE | backup  |+--------------+---------------+------+--------+---------+

这是在ProxySQL中实现备份的最简单方法之一。我们可以将这种方法用于新的部署。

Mysqldump

我们可以使用mysqldump执行ProxySQL备份。 但是,MySQL和Sqlite3数据库之间有一组不同的管理命令。 不过,我们可以通过忽略MySQL转储文件中不需要的对象来实现此目的。

Example

cmd-[root@mydbopslabs25 proxysql]# mysqldump -h127.0.0.1 -uadmin -padmin -P6032 --no-tablespaces --no-create-info --no-create-db --skip-triggers main mysql_servers | grep -i 'lock tables\|insert into' > mysqldump_data.sql[root@mydbopslabs25 proxysql]# ls -lrth mysqldump_data.sql -rw-r--r-- 1 root root 470 May  3 00:20 mysqldump_data.sqloutput-[root@mydbopslabs25 proxysql]# cat mysqldump_data.sql LOCK TABLES `mysql_servers` WRITE;INSERT INTO `mysql_servers` VALUES ('100','192.168.33.25','3306','ONLINE','1','0','1000','0','0','0','master'),('100','192.168.33.26','3306','ONLINE','1','0','1000','0','0','0','slave'),('100','192.168.33.27','3306','ONLINE','1','0','1000','0','0','0','slave1'),('100','192.168.33.28','3306','ONLINE','1','0','1000','0','0','0','slave2'),('100','192.168.33.29','3306','ONLINE','1','0','1000','0','0','0','backup');UNLOCK TABLES;

恢复mysqldump文件,

[root@mydbopslabs25 proxysql]# service proxysql stopShutting down ProxySQL: DONE![root@mydbopslabs25 proxysql]# pwd/var/lib/proxysql[root@mydbopslabs25 proxysql]# rm -rf [root@mydbopslabs25 proxysql]# service proxysql startStarting ProxySQL: 2019-05-03 00:26:23 [INFO] Using config file /etc/proxysql.cnfDONE![root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032 -vvv < /mysqldump_data.sql --------------LOCK TABLES `mysql_servers` WRITE--------------Query OK, 0 rows affected (0.00 sec)--------------INSERT INTO `mysql_servers` VALUES ('100','192.168.33.25','3306','ONLINE','1','0','1000','0','0','0','master'),('100','192.168.33.26','3306','ONLINE','1','0','1000','0','0','0','slave'),('100','192.168.33.27','3306','ONLINE','1','0','1000','0','0','0','slave1'),('100','192.168.33.28','3306','ONLINE','1','0','1000','0','0','0','slave2'),('100','192.168.33.29','3306','ONLINE','1','0','1000','0','0','0','backup')--------------Query OK, 5 rows affected (0.00 sec)--------------UNLOCK TABLES--------------Query OK, 0 rows affected (0.00 sec)Bye[root@mydbopslabs25 proxysql]# mysql -h127.0.0.1 -uadmin -padmin -P6032  -e "select hostgroup_id,hostname,port,status,comment from mysql_servers;"+--------------+---------------+------+--------+---------+| hostgroup_id | hostname      | port | status | comment |+--------------+---------------+------+--------+---------+| 100          | 192.168.33.25 | 3306 | ONLINE | master  || 100          | 192.168.33.26 | 3306 | ONLINE | slave   || 100          | 192.168.33.27 | 3306 | ONLINE | slave1  || 100          | 192.168.33.28 | 3306 | ONLINE | slave2  || 100          | 192.168.33.29 | 3306 | ONLINE | backup  |+--------------+---------------+------+--------+---------+

如上所述,由于在Sqlite3中大多数情况下不支持MySQL转储文件中的SQL语句(代码),因此恢复起来有点困难。

我相信该博客肯定会为正在为其ProxySQL服务器寻找备份解决方案的人提供帮助。

转载地址:http://nkvub.baihongyu.com/

你可能感兴趣的文章
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>