proxy SQL实现MySQL主从读写分离

proxy SQL实现MySQL主从读写分离

    • proxy SQL简介
    • 同类型产品
    • proxy SQL功能
    • 安装环境
    • MySQL主从搭建
    • proxy SQL安装
      • 下载
      • 安装 ProxySQL
      • 启动 ProxySQL
      • 查看 ProxySQL 的版本
      • 管理员登录 ProxySQL
      • 配置 ProxySQL 所需账户
      • ProxySQL 的多层配置系统
        • 在不同层次间移动配置
        • 管理配置
        • 小结
      • 设置proxy SQL监控账户
      • 配置proxy SQL对外操作账号设置
      • 管理端配置读写分离
      • 管理端定义路由规则
    • 测试读写分离
    • 问题总结
      • 1)navicat连接之后命令行操作SQL正常,新建查询SQL报错;

proxy SQL简介

ProxySQL 是一款可以实际用于生产环境的 MySQL 中间件,它有官方版和 percona 版两种。percona版是在官方版的基础上修改的,添加了几个比较实用的工具。本文以官方版本为例。

ProxySQL是用C++语言开发的,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数据),功能也足够,能满足中间件所需的绝大多数功能,包括:

  • 最基本的读/写分离,且方式有多种。
  • 可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由。换句话说,规则很灵活。基于schema和与语句级的规则,可以实现简单的sharding。
  • 可缓存查询结果。虽然ProxySQL的缓存策略比较简陋,但实现了基本的缓存功能,绝大多数时候也够用了。此外,作者已经打算实现更丰富的缓存策略。
  • 监控后端节点。ProxySQL可以监控后端节点的多个指标,包括:ProxySQL和后端的心跳信息,后端节点的read-only/read-write,slave和master的数据同步延迟性(replication
    lag)。

同类型产品

  • MySQL Route:是现在MySQL官方Oracle公司发布出来的一个中间件。
  • Atlas:是由奇虎360公发的基于MySQL协议的数据库中间件产品,它在MySQL官方推出的MySQL-Proxy
    0.8.2版本的基础上,修改了若干Bug,并增加了很多功能特性。目前该产品在360内部得到了广泛应用。
  • DBProxy:是由美团点评公司技术工程部DBA团队(北京)开发维护的一个基于MySQL协议的数据中间层。它在奇虎360公司开源的Atlas基础上,修改了部分bug,并且添加了很多特性。
  • Cobar:是阿里巴巴B2B开发的关系型分布式系统,管理将近3000个MySQL实例。
    在阿里经受住了考验,后面由于作者的走开的原因cobar没有人维护 了,阿里也开发了tddl替代cobar。
  • MyCAT:是社区爱好者在阿里cobar基础上进行二次开发,解决了cobar当时存
    在的一些问题,并且加入了许多新的功能在其中。目前MyCAT社区活跃度很高,目前已经有一些公司在使用MyCAT。总体来说支持度比较高,也会一直维护下去。

proxy SQL功能

  • 查询缓存
  • 查询路由
  • 故障转移
  • 在线配置立刻生效无需重启
  • 应用层代理
  • 跨平台
  • 高级拓展支持
  • 防火墙

通过上述,我们可以看到ProxySQL可以做许多事情,已经不仅仅是纯粹的MySQL读写分离,其实我们通过后面所述结合业务发散,ProxySQL还可以支持以下高级功能:

  • 读写分离
  • 数据库集群、分片
  • 分库分表
  • 主从切换
  • SQL审计
  • 连接池
  • 多路复用
  • 负载均衡
  • 查询重写
  • 流量镜像
  • 自动重连
  • 自动下线

安装环境

IP 备注
192.168.1.10 MySQL主
192.168.1.20 MySQL从
192.168.1.30 proxy SQL
  • 先把防火墙、沙盒进行关闭(三台)
systemctl stop firewalld && setenforce 0 && systemctl disable firewalld

MySQL主从搭建

  • 以下操作为(192.168.1.10,192.168.1.20)

安装MySQL5.6教程:点击跳转到安装指南

主节点配置:

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set password=PASSWORD("123.com") where User='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123.com";
Query OK, 0 rows affected (0.00 sec)

----------------------
1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
server-id=1
log-bin=master-bin
log-slave-updates=true
-------------
[root@localhost ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 |      538 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

从节点配置:

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set password=PASSWORD("123.com") where User='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123.com";
Query OK, 0 rows affected (0.00 sec)

----------------------

> 注意:"从库" 的配置文件/etc/my.cnf中必须包含 "read-only"参数

1、编辑mysql的配置文件/etc/my.cnf
[mysqld]
server-id=2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read-only
-------------
[root@localhost ~]# systemctl restart mysqld

mysql>CHANGE MASTER TO MASTER_HOST='192.168.1.10',MASTER_USER='slave',MASTER_PASSWORD='123.com',MASTER_LOG_FILE='master-bin.000002',MASTER_LOG_POS=538;

Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.10
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000002
          Read_Master_Log_Pos: 538
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 284
        Relay_Master_Log_File: master-bin.000002
             Slave_IO_Running: Yes    #必须Yes
            Slave_SQL_Running: Yes 	  #必须Yes
.....

proxy SQL安装

  • 以下操作为(192.168.1.30)

下载

wget https://github.com/sysown/proxysql/releases/download/v2.0.8/proxysql-2.0.8-1-centos7.x86_64.rpm

安装 ProxySQL

[root@localhost ~]# rpm -ivh proxysql-2.0.8-1-centos7.x86_64.rpm
错误:依赖检测失败:
	perl(DBD::mysql) 被 proxysql-2.0.8-1.x86_64 需要
	perl(DBI) 被 proxysql-2.0.8-1.x86_64 需要
解决:
安装依赖包
[root@localhost ~]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
[root@localhost ~]# rpm -ivh proxysql-2.0.8-1-centos7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:proxysql-2.0.8-1                 警告:群组proxysql 不存在 - 使用root
警告:群组proxysql 不存在 - 使用root
################################# [100%]
Created symlink from /etc/systemd/system/multi-user.target.wants/proxysql.service to /etc/systemd/system/proxysql.service.
# 查看相应安装文件路径,有哪些文件
[root@localhost ~]# rpm -ql proxysql
/etc/logrotate.d/proxysql
/etc/proxysql.cnf
/etc/systemd/system/proxysql.service
/usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

/etc/proxysql.cnf 是 ProxySQL 的配置文件

启动 ProxySQL

[root@localhost ~]# systemctl start proxysql.service
[root@localhost ~]# netstat -tunlp | grep proxysql
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      19257/proxysql      
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      19257/proxysql 

6032 是 ProxySQL 的管理端口号,6033是对外服务的端口号
ProxySQL 的用户名和密码都是默认的 admin

查看 ProxySQL 的版本

[root@localhost ~]# proxysql --version
ProxySQL version 2.0.8-67-g877cab1, codename Truls

管理员登录 ProxySQL

前提也需要能进入MySQL命令行,所以安装一个mariadb

[root@localhost ~]# yum -y install mariadb
[root@localhost ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL Admin Module)

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

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

MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)

可见有五个库: main、disk、stats 、monitor 和 stats_history
main: 内存配置数据库,即 MEMORY,表里存放后端 db 实例、用户验证、路由规则等信息。main 库中有如下信息:

MySQL [(none)]> use main;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [main]> show tables;
+--------------------------------------------+
| tables                                     |
+--------------------------------------------+
| global_variables                           |
| mysql_aws_aurora_hostgroups                |
| mysql_collations                           |
| mysql_galera_hostgroups                    |
| mysql_group_replication_hostgroups         |
| mysql_query_rules                          |
| mysql_query_rules_fast_routing             |
| mysql_replication_hostgroups               |
| mysql_servers                              |
| mysql_users                                |
| proxysql_servers                           |
| runtime_checksums_values                   |
| runtime_global_variables                   |
| runtime_mysql_aws_aurora_hostgroups        |
| runtime_mysql_galera_hostgroups            |
| runtime_mysql_group_replication_hostgroups |
| runtime_mysql_query_rules                  |
| runtime_mysql_query_rules_fast_routing     |
| runtime_mysql_replication_hostgroups       |
| runtime_mysql_servers                      |
| runtime_mysql_users                        |
| runtime_proxysql_servers                   |
| runtime_scheduler                          |
| scheduler                                  |
+--------------------------------------------+
24 rows in set (0.00 sec)

库下的主要表:
mysql_servers: 后端可以连接 MySQL 服务器的列表
mysql_users: 配置后端数据库的账号和监控的账号。
mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。

注: 表名以 runtime_开头的表示 ProxySQL 当前运行的配置内容,不能通过 DML 语句修改。

只能修改对应的不以 runtime 开头的表,然后 “LOAD” 使其生效,“SAVE” 使其存到硬盘以供下次重启加载。
disk :持久化的磁盘的配置
stats: 统计信息的汇总
monitor:一些监控的收集信息,比如数据库的健康状态等
stats_history: 这个库是 ProxySQL 收集的有关其内部功能的历史指标

配置 ProxySQL 所需账户

在主MySQL(192.168.1.10)上创建 ProxySQL 的监控账户和对外访问账户

#proxysql 的监控账户
grant all privileges on *.* to 'monitor'@'192.168.1.%' identified by '123456';
grant all privileges on *.* to 'monitor'@'%' identified by '123456';
 
#proxysql 的对外访问账户
grant all privileges on *.* to 'proxysql'@'192.168.1.%' identified by '123456';
grant all privileges on *.* to 'proxysql'@'%' identified by '123456';

#刷新权限 
flush privileges;

注意 8.0.x 用户认证的方式需要修改为 mysql_native_password
需要在my.cnf 加上这个用户认证方式,再来创建用户

[mysqld]
default_authentication_plugin=mysql_native_password

proxy SQL实现MySQL主从读写分离_第1张图片

ProxySQL 的多层配置系统

配置结构如下:
proxy SQL实现MySQL主从读写分离_第2张图片

https://github.com/sysown/proxysql/wiki/Configuring-ProxySQL

整套配置系统分为三层:顶层为 RUNTIME ,中间层为 MEMORY , 底层也就是持久层 DISK 和 CONFIG FILE 。

RUNTIME : 代表 ProxySQL 当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层 “load” 进来。
MEMORY: MEMORY 层上面连接 RUNTIME 层,下面连接持久层。这层可以正常操作 ProxySQL 配置,随便修改,不会影响生产环境。修改一个配置一般都是现在 MEMORY 层完成的,确认正常之后在加载达到 RUNTIME 和 持久化的磁盘上。

DISK 和 CONFIG FILE:持久化配置信息,重启后内存中的配置信息会丢失,所需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。

在不同层次间移动配置

为了将配置持久化到磁盘或者应用到 runtime,在管理接口下有一系列管理命令来实现它们。
要重新配置 MySQL 用户,可执行下面的其中一个命令:

1、LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
 将内存数据库中的配置加载到 runtime 数据结构,反之亦然。
2、SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
 将 MySQL 用户从 runtime 持久化到内存数据库。
3、LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
 从磁盘数据库中加载 MySQL 用户到内存数据库中。
4、SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
 将内存数据库中的 MySQL 用户持久化到磁盘数据库中。
5、LOAD MYSQL USERS FROM CONFIG
 从配置文件中加载 MySQL 用户到内存数据库中。

要处理 MySQL server:

1、LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
 将 MySQL server 从内存数据库中加载到 runtime。
2、SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
 将 MySQL server 从 runtime 持久化到内存数据库中。
3、LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
 从磁盘数据库中加载 MySQL server 到内存数据库。
4、SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
 从内存数据库中将 MySQL server 持久化到磁盘数据库中。
5、LOAD MYSQL SERVERS FROM CONFIG
 从配置文件中加载 MySQL server 到内存数据库中

要处理 MySQL 的查询规则(mysql query rules):

1、 LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME
 将 MySQL query rules 从内存数据库加载到 runtime 数据结构。
2、 SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME
 将 MySQL query rules 从 runtime 数据结构中持久化到内存数据库。
3、 LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK
 从磁盘数据库中加载 MySQL query rules 到内存数据库中。
4、 SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK
 将 MySQL query rules 从内存数据库中持久化到磁盘数据库中。
5、 LOAD MYSQL QUERY RULES FROM CONFIG
 从配置文件中加载 MySQL query rules 到内存数据库中。

要处理 MySQL 变量(MySQL variables):

1、 LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME
 将 MySQL variables 从内存数据库加载到 runtime 数据结构。
2、 SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME
 将 MySQL variables 从 runtime 数据结构中持久化到内存数据中。
3、 LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK
 从磁盘数据库中加载 MySQL variables 到内存数据库中。
4、 SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK
 将 MySQL variables 从内存数据库中持久化到磁盘数据库中。
5、 LOAD MYSQL VARIABLES FROM CONFIG
 从配置文件中加载 MySQL variables 到内存数据库中。

要处理管理变量(admin variables):

1、 LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME
 将 admin variables 从内存数据库加载到 runtime 数据结构。
2、 SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME
 将 admin variables 从 runtime 持久化到内存数据库中。
3、 LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK
 从磁盘数据库中加载 admin variables 到内存数据库中。
4、 SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK
 将 admin variables 从内存数据库中持久化到磁盘数据库。
5、 LOAD ADMIN VARIABLES FROM CONFIG
 从配置文件中加载 admin variables 到内存数据库中。

proxy SQL实现MySQL主从读写分离_第3张图片
proxy SQL实现MySQL主从读写分离_第4张图片
一般在内存那层修改 ,然后保存到运行系统,保存到磁盘数据库系统

load xxx to runtime;
save xxx to disk;
管理配置
  • disk and config file 持久化配置文件
disk -> 是sqlite3 数据库 ,默认位置是$DATADIR/proxysql.db( /var/lib/proxysql/proxysql.db)
config file 是一个传统配置文件:一般不更改
  • 在内存中动态更改配置,如果重启,没进行持久化(save) 则会丢失。

三则之间关系:

  • proxysql 启动时,首先去找/etc/proxysql.cnf 找到它的datadir,如果datadir下有proxysql.db
    就加载proxysql.db的配置
  • 如果启动proxysql时带有–init标志,会用/etc/proxsql.cnf的配置,把Runtime,disk全部初始化一下
  • 在调用是调用–reload 会把/etc/proxysql.cnf 和disk
    中配置进行合并。如果冲突需要用户干预。disk会覆盖config file。

关于传统的配置文件
传统配置文件默认路径为/etc/proxysql.cnf,也可以在二进制程序proxysql上使用-c或–config来手动指定配置文件。
默认情况下:几乎不需要手动去配置proxysql.cnf。端口号,管理proxysql用户明吗,可以在这里修改

小结

这里有几个最常用的命令:如何让修改的配置生效(runtime),以及如何持久化到磁盘上(disk)。记住,只要不是加载到 runtime,修改的配置就不会生效。

LOAD MYSQL USERS TO RUNTIME;  将内存数据库中的配置加载到 runtime 数据结构
SAVE MYSQL USERS TO DISK;   将内存数据库中的 MySQL 用户持久化到磁盘数据库中。
LOAD MYSQL SERVERS TO RUNTIME;  将 MySQL server 从内存数据库中加载到 runtime。
SAVE MYSQL SERVERS TO DISK;   从内存数据库中将 MySQL server 持久化到磁盘数据库中。
LOAD MYSQL QUERY RULES TO RUNTIME;  将 MySQL query rules 从内存数据库加载到 runtime 数据结构。
SAVE MYSQL QUERY RULES TO DISK;  将 MySQL query rules 从内存数据库中持久化到磁盘数据库中。
LOAD MYSQL VARIABLES TO RUNTIME;  将 MySQL variables 从内存数据库加载到 runtime 数据结构。
SAVE MYSQL VARIABLES TO DISK;   将 MySQL variables 从内存数据库中持久化到磁盘数据库中。
LOAD ADMIN VARIABLES TO RUNTIME;   将 admin variables 从内存数据库加载到 runtime 数据结构。
SAVE ADMIN VARIABLES TO DISK;  将 admin variables 从内存数据库中持久化到磁盘数据库。

注意:只有加载到 runtime 状态时才会去做最后的有效性验证。在保存到内存数据库或持久化到磁盘上时,都不会发生任何警告或错误。当加载到 runtime 时,如果出现错误,将恢复为之前保存得状态,这时可以去检查错误日志。

设置proxy SQL监控账户

在MySQL主节点已经创建过monitor账号
在proxy SQL端进行配置一下
1)连接管理端口。

mysql -uadmin -padmin -P6032 -h127.0.0.1

2)管理端配置这个monitor监控用户,配置方式是修改全局变量

set mysql-monitor_username='monitor';
set mysql-monitor_password='123456';

3)查看monitor监控用户是否生效

select * from global_variables;

在这里插入图片描述
4)查看monitor监控用户连接

select * from mysql_server_connect_log;

proxy SQL实现MySQL主从读写分离_第5张图片
注:null为正常连接
5)查看monitor监控用

 select * from mysql_server_ping_log;

proxy SQL实现MySQL主从读写分离_第6张图片
6)执行语句加入内存和磁盘

load mysql variables to runtime;
save mysql variables to disk;

配置proxy SQL对外操作账号设置

1)在管理端添加对外提供服务IP和端口

   set mysql-interfaces='192.168.1.30:6033';

2)把proxysql账号添加到mysql_servers中

insert into mysql_users(username,password,default_hostgroup)values('proxysql','123456',1);

3)加到内存和磁盘中

load mysql users to runtime;
save mysql users to disk;

成功如下图所示:
在这里插入图片描述

管理端配置读写分离

1)将MySQL主从服务器信息添加入mysql_servers表中。
先将主从服务器存放在同一组内,等指定好读写规则后,系统会根据配置文件中的read-only值自动将其分别添加至读组和写组,命令如下:

insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(1,'192.168.1.10',3306,1,1000,10,'vip'),(1,'192.168.1.20',3306,1,1000,10,'slave');

proxy SQL实现MySQL主从读写分离_第7张图片

执行以下命令即时生效:
load mysql servers to runtime;
save mysql servers to disk;

2)设置读写分组

INSERT INTO mysql_replication_hostgroups VALUES (1,2,'one-master-2-slave');

proxy SQL实现MySQL主从读写分离_第8张图片

执行以下命令即时生效:

load mysql servers to runtime;
save mysql servers to disk;

此时查看mysql_server表此时已经将服务器分组
在这里插入图片描述

管理端定义路由规则

在mysql_query_rules中添加路由规则,命令如下:

Insert into mysql_query_rules(rule_id,active,username,match_pattern, destination_hostgroup,apply) values(10,1,'proxysql','^SELECT.*FOR UPDATE$',1,1);
Insert into mysql_query_rules(rule_id,active,username,match_pattern, destination_hostgroup,apply) values(11,1,'proxysql','^SELECT',2,1);
LOAD MYSQL QUERY RULES TO RUNTIME; 
SAVE MYSQL QUERY RULES TO DISK; 

测试读写分离

本地使用MySQL命令行或者navicat都可以连接proxy SQL:6033端口

[root@localhost ~]# mysql -uproxysql -p123456 -P6033 -h127.0.0.1
MySQL [(none)]> create database A;
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> create database B;
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> use A;
Database changed

MySQL [A]> create table  test(id char(10),name char(10));
Query OK, 0 rows affected (0.03 sec)

MySQL [A]> insert into test(id,name) values(1,'hy');
Query OK, 1 row affected (0.00 sec)

MySQL [A]> select * from test;
+------+------+
| id   | name |
+------+------+
| 1    | hy   |
+------+------+
1 row in set (0.00 sec)

proxy SQL:6032端口查看

MySQL [(none)]> select hostgroup,schemaname,username,digest_text,count_star from  stats_mysql_query_digest;
+-----------+--------------------+----------+---------------------------------------------+------------+
| hostgroup | schemaname         | username | digest_text                                 | count_star |
+-----------+--------------------+----------+---------------------------------------------+------------+
| 1         | A                  | proxysql | insert into test(id,name) values(?,?)       | 1          |
| 1         | A                  | proxysql | show tables                                 | 1          |
| 1         | A                  | proxysql | create table test(id char(?),name char(?))  | 1          |
| 2         | information_schema | proxysql | SELECT DATABASE()                           | 1          |
| 1         | information_schema | proxysql | create database A                           | 1          |
| 2         | A                  | proxysql | select * from test                          | 1          |
| 1         | information_schema | proxysql | select @@version_comment limit ?            | 2          |
| 1         | information_schema | proxysql | show databases                              | 1          |
| 1         | information_schema | proxysql | create database B                           | 1          |
| 1         | A                  | proxysql | create tables test(id char(?),name char(?)) | 1          |
| 1         | A                  | proxysql | show databases                              | 1          |
+-----------+--------------------+----------+---------------------------------------------+------------+

问题总结

1)navicat连接之后命令行操作SQL正常,新建查询SQL报错;

报错界面:
proxy SQL实现MySQL主从读写分离_第9张图片
解决:登录proxysql:6032

set mysql-set_query_lock_on_hostgroup=0;
load mysql variables to runtime;
save mysql variables to disk;

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