mysql获取当前时间_MYSQL proxysql 在深入 信息获取和信息输出

1844b7dfa68d651d359d5bbf363e5a89.png

ProxySQL 前两期针对不同的MYSQL高可用的方式来说的, 本期会更加深入到PROXYSQL 的一些本身的东西.

在PROXYSQL 中有一个表,存储了所有的global variables, 其中包含了大量的变量值.实际上,这些就是键值对.  其中分为 MYSQL  为前缀的和 以 admin为前缀的两个部分.

abee15d213bd856af96c863e93387882.png

其中mysql 为前缀的主要是与MYSQL 有关的变量,

1 mysql-auditlog_filename  这个变量主要是建立一个auditlog , 给出相关路径和文件名, 会在指定的位置生成audit log , audit log 主要是记录与中间件proxysql 连接的账号,地址以及操作的数据库对象, 使用json的格式.

update global_variables set variable_value = '/proxysql/log/audit.log' where variable_name = 'mysql-auditlog_filename' ;

056af9d842c7464d63817bf287920beb.png

其中包含访问的时间,数据库账号,访问的源地址等等信息,基本上

2 记录访问MYSQL中的一些访问的语句通过不同的条件来过滤

从proxysql 2.0.6 开始可以记录查询中的相关的记录, 默认这个开关是关闭的

9bfeee8b185b1cd626bac7663c9fe03c.png

配置是相对简单的,例如我们对某个应用账号的执行的语句进行监控,则我们可以做以下工作.

SET mysql-eventslog_filename='queries.log';

SET mysql-eventslog_default_log=1;

INSERT INTO mysql_query_rules (rule_id, active,username, log,apply) VALUES (1,1,'contact',1,0);

SET mysql-eventslog_format=2;

SAVE MYSQL VARIABLES TO DISK;

LOAD MYSQL VARIABLES TO RUNTIME;

在操作完毕后,凡是 contact 账号操作的语句会被记录在queries.log 文件中

3  关于proxysql 的工作情况

虽然PROXYSQL 比较皮实耐用,但了解内部的系统的一些运行状态还是重要的,

0faee0cdc18b95d157215ed37ea3472d.png

jemalloc_active 已经分配给应用的页面

jemalloc_allocated  已经分配给应用的字节

jemalloc_metadata   元数据库分配的内存

Auth_memory 认证模块分配的内存

SQLlite3_memory_bytes PROXYSQL 分配的内存

query_digest_memory 上面刚刚提到的,对执行的语句进行过滤分配的内存

ProxySQL  本身也对执行的语句进行一个统计,下面的

42bf5d83c1bf345734afcd77b0fdb8c1.png

select * from global_variables where variable_name = 'mysql-commands_stats'; 

默认统计PROXYSQL 接受的语句,并根据语句的反馈进行相关的统计

SELECT * FROM stats_mysql_commands_counters;

可以根据其中的已经有的统计项对相关的命令进行一个统计, 这弥补了部分MYSQL方面的这部分的统计数据获取的麻烦.

01ad98a04170ea9577dd68b40e2873f2.png

上图是通过对 stats_mysql_connection_pool 进行访问,得到当前外部访问MYSQL 的状态, 这个表可以显现,当前有多少连接针对指定的数据库服务器,并且产生的queries  ,产生的数据发送bytes ,接受到的bytes 等等信息

ca3d90396869b0d94cf06f041a8cb954.png

在MYSQL 中可以通过 show processlist 来查看当前和MYSQL正在交互的session的清空, PROXYSQL 中也是提供 stats_mysql_processlist 对系统当前连接进来的连接进行展示.

在MYSQL中5.7 已经具备了追踪历史查询的功能, proxysql 也提供了类似的功能并且统计的信息会更全面提取更方便.

select * from stats_mysql_query_digest;

5d9e97d6659897d7482a57693e1332e0.png

或者统计当前的与数据库有关的账户连接的情况

475df216ffcd55131c7f446e64640288.png

mysql 本身统计相关信息的方式也不少,但proxysql 将这些统计信息做的更好,并且提取时也不会和MYSQL 本身有冲突.

除此以外proxysql 也具备相关的丰富的日志记录功能,在数据库中有一个monitor 数据库,其中存储着相关的监控记录, 以下举几个例子

c00488aa4579f42599f79634e1465a95.png

1   如何判断proxysql 和 数据库服务器之间的网络响应的问题

通过下面的语句

select * from mysql_server_ping_log where time_start_us in (select time_start_us from mysql_server_ping_log order by time_start_us desc limit 3);

930fed189366606df74c9e993c0b6ba6.png

通过遍历最新的记录,可以判断数据库和PROXYSQL的连通性和时间延迟,或者根本就无法连接的问题。

2  PROXYSQL 与数据库连接之间的时间

select * from mysql_server_connect_log where time_start_us in (select time_start_us from mysql_server_connect_log order by time_start_us desc limit 3);

1ac8c1b6a7db68cfbf681e6e859e6d1e.png

3 判断到底当前主库和从库之间到底谁是主谁是从。

select hostname,time_start_us,success_time_us,read_only from mysql_server_read_only_log where time_start_us in (select time_start_us from mysql_server_read_only_log order by time_start_us desc limit 5);

1ac8c1b6a7db68cfbf681e6e859e6d1e.png

这三者有什么关系,1 最基本的是中间件和数据库之间是否连通,如果此处出现问题,则表明中间件和数据库之间的网络或者连通的数据库本身是否出现问题,出现问题就需要告警

2  此时与数据库连接之间的问题是1来判断,而2 则是判断PROXYSQL 与数据库之间的连接的状态的问题,这里主要注意的是,连接的时间

3  则是判定数据流的目的地是哪里,整体的数据复制集合中,主库是否存在通过这个日志可以判断当前的数据流的流向以及主从库的状态问题。

所以完全可以通过PROXYSQL 来写一套程序来判断当前整体MYSQL复制集的状态。

另外本身PROXYSQL 的stats_ 就可以通过MYSQL 协议来进行各种状态的获取,并且一些开源监控软件 PMM 也可以对其进行监控. PROXYSQL 也对监控的方式提供了 WEB 方式,  提供的数据比较有限, 但在没有其他方式的加持和对此进行一个图形监控的时候,这个方式也是一个好方法.

4afd216288699e74fb008fda09ae812e.png

今天就到此为止,但PROXYSQL 本身的功能是强大了,例如读写分离, 以及控制读写分离在主从延迟后的如何操作都有相关的设置

e3d524df51f501e9816d282a186e23c5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用`mysql_real_query`函数执行MySQL查询,您需要先初始化MySQL连接并建立与MySQL服务器的连接。以下是一个简单的示例: ```cpp #include <mysql/mysql.h> #include <iostream> int main() { // 初始化MySQL连接 MYSQL mysql; mysql_init(&mysql); // 建立与MySQL服务器的连接 if (!mysql_real_connect(&mysql, "localhost", "username", "password", "database", 0, NULL, 0)) { std::cout << "连接到MySQL服务器失败: " << mysql_error(&mysql) << std::endl; return 1; } // 执行查询 const char* query = "SELECT * FROM table"; if (mysql_real_query(&mysql, query, strlen(query)) != 0) { std::cout << "查询执行失败: " << mysql_error(&mysql) << std::endl; return 1; } // 获取查询结果集 MYSQL_RES* result = mysql_store_result(&mysql); if (result == NULL) { std::cout << "获取查询结果集失败: " << mysql_error(&mysql) << std::endl; return 1; } // 遍历结果集并获取数据 MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { // 在这里处理每一行数据 // row[i] 表示第 i+1 列的数据,索引从0开始 } // 释放结果集内存 mysql_free_result(result); // 关闭与MySQL服务器的连接 mysql_close(&mysql); return 0; } ``` 在上述示例中,我们首先初始化了一个`MYSQL`结构体并使用`mysql_init`函数进行初始化。然后使用`mysql_real_connect`函数建立与MySQL服务器的连接,其中包括MySQL服务器的主机名、用户名、密码和数据库名。 接下来,我们使用`mysql_real_query`函数执行查询语句。如果执行失败,可以使用`mysql_error`函数获取错误信息。 如果查询执行成功,我们可以使用`mysql_store_result`函数获取结果集。然后,可以使用`mysql_fetch_row`函数遍历结果集中的每一行数据,并对数据进行处理。 最后,记得释放结果集内存,并使用`mysql_close`函数关闭与MySQL服务器的连接。 请注意,以上示例是一个简化版的代码,并没有考虑错误处理和异常情况。在实际应用中,建议添加适当的错误处理和异常处理机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值