zoukankan      html  css  js  c++  java
  • ProxySQL 常见表配置

    ProxySQL 常见表配置

    [root@mgr1 opt]# rpm -ivh proxysql-1.4.14-1.1.el6.x86_64.rpm 
    warning: proxysql-1.4.14-1.1.el6.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
    Preparing...                ########################################### [100%]
       1:proxysql               ########################################### [100%]
    ProxySQL默认配置文件为/etc/proxysql.cnf,只在第一次启动的时候有用,后续的所有配置都是通过对SQLite数据库的操作,并且不会更新到proxysql中,而是存储在/var/lib/proxysql/proxysql.db中
    [root@mgr1 opt]# proxysql --version ##版本查询
    ProxySQL version 1.4.14-percona-1.1, codename Truls
    [root@mgr1 opt]# rpm -ql proxysql  ##查看具体安装内容
    /etc/init.d/proxysql               ##启动脚本
    /etc/logrotate.d/proxysql-logrotate
    /etc/proxysql-admin.cnf             ##配置文件
    /etc/proxysql.cnf                   ##默认配置文件
    /usr/bin/proxysql                   ##执行文件
    /usr/bin/proxysql-admin
    /usr/bin/proxysql-status
    /usr/bin/proxysql_galera_checker    ##ProxySQL调度程序检查pxc_maint_mode参数状态,持续检测各个节点的状态
    /usr/bin/proxysql_node_monitor
    /usr/share/doc/proxysql-1.4.14
    /usr/share/doc/proxysql-1.4.14/LICENSE
    /var/lib/proxysql
    /var/run/proxysql
    /var/lib/proxysql/proxysql.db   ##SQLite数据文件
    /var/lib/proxysql/proxysql.log  ##日志文件
    备注:如果存在proxysql.db数据文件,则ProxySQL启动过程中将不会读取proxysql.cnf配置文件的内容来初始化ProxySQL

    登录数据库

    [mysql@mgr1 ~]$ mysql -uadmin -padmin -h127.0.0.1 -P6032
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    (admin@127.0.0.1:6032) [(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 |
    +-----+---------------+-------------------------------------+

    内置库
    main:默认数据库名,用于存放后端db实例、用户认证、路由规则等信息。
               表名以runtime开头的表示proxysql当前运行的配置内容,不能通过dml语句修改。
               只能修改对应的不以runtime开头的(在内存)里的表,然后LOAD使其生效,SAVE使其存到硬盘以供下次重启加载。
    disk:是持久化到硬盘的配置,sqlite数据文件。
    stats:是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询各类汇总、执行时间等。
    monitor:库存储monitor模块收集的信息,主要是对后端db的健康、延迟检查。

    main库
    runtime_表

    (admin@127.0.0.1:6032) [(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
    (admin@127.0.0.1:6032) [main]> show tables;
    +--------------------------------------------+
    | tables                                     |
    +--------------------------------------------+
    | global_variables                           |
    | mysql_collations                           |
    | 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_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                                  |
    +--------------------------------------------+
    20 rows in set (0.00 sec)
    runtime_global_variables:global_variables的运行时版本
    runtime_mysql_group_replication_hostgroups:mysql_group_replication_hostgroups的运行时版本
    runtime_mysql_query_rules:mysql_query_rules的运行时版本
    runtime_mysql_replication_hostgroups:mysql_replication_hostsgroups的运行时版本
    runtime_mysql_servers:mysql_servers的运行时版本
    runtime_mysql_users:mysql_users的运行时版本
    runtime_scheduler:scheduler调度程序的运行时版本
    CREATE TABLE runtime_checksums_values (
        name VARCHAR NOT NULL,
        version INT NOT NULL,
        epoch INT NOT NULL,
        checksum VARCHAR NOT NULL,
        PRIMARY KEY (name))

    内置参数表,参考下文
    mysql_servers表

    (admin@127.0.0.1:6032) [main]> show create table mysql_serversG
    *************************** 1. row ***************************
           table: mysql_servers
    Create Table: 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) )
    1 row in set (0.00 sec)
    	hostgroup_id:ProxySQL通过hostgroup的形式组织后端db实例,一个hostgroup代表同属于一个角色。
    	表的主键是(hostgroup_id, hostname, port),以hostname:port在多个hostgroup中存在。
    	一个hostgroup可以有多个实例,即是多个从库,可能通过weight分配权重。
    	hostgroup_id 0是一个特殊的hostgroup,路由查询的时候,没有匹配到规则则默认选择hostgroup 0
    status:
    ONLINE:当前后端实例状态正常。
    SHUNNED:临时被剔除,可能因为后端too many connection error,或者超过了max_replication_lag。
    OFFLINE_SOFT:软离线状态,不再接受新的连接,但已建立的连接会等待活跃事务完成。
    OFFLINE_HARD:硬离线状态,不再接受新的连接,已建立的连接或被强制中断,当后端实例宕机或网络不可达,会出现。
    weight :权重,默认为1
    max_connections:允许连接到该后端实例的最大连接数,不要大于MySQL的max_connections。
    如果后端实例hostname:port在多个hostgroup里,以较大者为准,而不是各自独立允许的最大连接数。
    max_replication_lag:允许的最大延迟,主库不受影响,默认为0,如果>0,monitor模块监控主从延迟大于阈值时,会临时把它的状态变更为SHUNNED。
    max_latency_ms:mysql_ping响应时间,大于这个阈值会把它从连接池剔除,即使是ONLINE。
    comment:备注,不建设为空。
    

    mysql_uses表

    (admin@127.0.0.1:6032) [main]> show create table mysql_usersG
    *************************** 1. row ***************************
           table: mysql_users
    Create Table: CREATE TABLE mysql_users (
        username VARCHAR NOT NULL,
        password VARCHAR,
        active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
        use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0,
        default_hostgroup INT NOT NULL DEFAULT 0,
        default_schema VARCHAR,
        schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0,
        transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1,
        fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0,
        backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1,
        frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1,
        max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000,
        PRIMARY KEY (username, backend),
        UNIQUE (username, frontend))
    1 row in set (0.00 sec)
    username,password:连接到后端MySQL或ProxySQL实例的凭证,参考密码管理。
         密码可插入明文,也可通过PASSWORD()插入密文,proxysql以*开头判断插入是否是密文。
         但是runtime_mysql_users里统一是密文,所以明文插入,再SAVE MYSQL USERS TO MEM,此时看到的也是HASH密文。
    active:是否生效该用户,active=0的用户将在数据库中被跟踪,但不会加载到内存中的数据结构中。
    default_hostgroup:这个用户的请求没有匹配到规则时,默认发到hostgroup,默认0。
    default_schema:这个用户连接时没有指定schema时,默认使用的schema。
        默认为NULL,实际上受变量mysql-default_schema的影响,默认为information_schema。
    transaction_persistent: 如果设置为1,连接上ProxySQL的会话后,如果在一个hostgroup上开启了事务,那么后续的sql都继续维持在这个hostgroup上,不论是否会匹配上其它路由规则,直到事务结束。
    frontend:如果设置为1,则用户名、密码对ProxySQL进行身份验证。
    backend:如果设置为1,则用户名、密码根据任何主机组向mysqld服务器进行身份验证。
      注意,目前所有用户都需要将“前端”和“后端“都设置为1,未来版本的ProxySQL将分离前端和后端之间的crendentials。
      以这种方式,前端将永远不会知道直接连接到后端的凭据,强制所有通过ProxySQL的连接并增加系统的安全性。
    

    mysql_replication_hostgroups 表

    (admin@127.0.0.1:6032) [main]> show create table mysql_replication_hostgroupsG
    *************************** 1. row ***************************
           table: mysql_replication_hostgroups
    Create Table: CREATE TABLE mysql_replication_hostgroups (
        writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
        reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0),
        comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))
    1 row in set (0.00 sec)
    定义hostgroup的主从关系。ProxySQL monitor模块会监控hostgroup后端所有servers的read_only变量,如果发现从库的read_only变为0、主库变为1,则认为角色互换了,
    自动改写mysql_servers表里面hostgroup关系,达到failover效果。
    

    mysql_query_rules查询规则表

    (admin@127.0.0.1:6032) [main]> show create table mysql_query_rulesG 
    *************************** 1. row ***************************
           table: mysql_query_rules
    Create Table: CREATE TABLE mysql_query_rules (
        rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0,
        username VARCHAR,
        schemaname VARCHAR,
        flagIN INT NOT NULL DEFAULT 0,
        client_addr VARCHAR,
        proxy_addr VARCHAR,
        proxy_port INT,
        digest VARCHAR,
        match_digest VARCHAR,
        match_pattern VARCHAR,
        negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0,
        re_modifiers VARCHAR DEFAULT 'CASELESS',
        flagOUT INT,
        replace_pattern VARCHAR,
        destination_hostgroup INT DEFAULT NULL,
        cache_ttl INT CHECK(cache_ttl > 0),
        reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL,
        timeout INT UNSIGNED,
        retries INT CHECK (retries>=0 AND retries <=1000),
        delay INT UNSIGNED,
        next_query_flagIN INT UNSIGNED,
        mirror_flagOUT INT UNSIGNED,
        mirror_hostgroup INT UNSIGNED,
        error_msg VARCHAR,
        OK_msg VARCHAR,
        sticky_conn INT CHECK (sticky_conn IN (0,1)),
        multiplex INT CHECK (multiplex IN (0,1,2)),
        log INT CHECK (log IN (0,1)),
        apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0,
        comment VARCHAR)
    1 row in set (0.00 sec)
    rule_id:表主键,自增,规则处理是以rule_id为顺序进行。
    active:只有active=1时的规则才会参与匹配。
    username:过滤匹配用户名的条件,如果是非空值,则仅当连接使用正确的用户名时,查询才匹配。
    schemaname:匹配schemaname的过滤条件,如果是非空值,则仅当连接schemaname用作默认模式时,查询才匹配。
    flagIN,flagOUT,apply:用来定义路由链chains of rules
    	首先会检查flagIN=0的规则,以rule_id的顺序;如果没有匹配上,则走这个用户的default_hostgroup。
    	当匹配一条规则后,会检查flagOUT。
    	如果不为NULL,并且flagIN!=flagOUT,则进入以flagIN为上一个flagOUT值的新规则链。
    	如果不为NULL,并且flagIN=flagOUT,则应用这条规则。
    	如果为NULL,或者apply=1,则结束,应用这条规则。
    	如果最终没有匹配到,则找到这个用户的default_hostgroup。
    client_addr:匹配客户端来源IP。
    proxy_addr,proxy_port:匹配本地proxysql的ip、端口。
    digest:精确匹配的查询。
    match_digest:正则匹配查询。query,digest是指对查询去掉具体值后进行”模糊化“后的查询,类似pt-query-digest的效果。
    match_pattern:正则匹配查询。
    	以上都是匹配查询的规则,1.4版本可以通过变量mysql-query_processor_regex设置,支持RE2和PCRE,1.4版本开始默认为PCRE。
    negate_match_pattern:反向匹配,相当于对match_digest/match_pattern的匹配取反。
    re_modifiers:修改正则匹配的参数,比如默认的:忽略大小写CASELESS、禁用GLOBAL。
    下面是匹配后的行为:
    replace_pattern:查询重写,默认为空。
    destination_hostgroup:路由查询到这个hostgroup,当然如果用户显式start transaction且transaction_persistent=1,那么即使匹配到了,也依然按照事务里第一条sql的路由规则去走的。
    cache_ttl:查询结果缓存的毫秒数。
    timeout:这一类查询执行的的最大时间(毫秒),超时则自动kill。
    	这是对后端DB的保护机制,相当于阿里云RDS的loose_max_statement_time变量的功能,但不同的是,阿里云这个变量的时间时不包括DML操作出现InnoDB行锁等待的时间,
    	而ProxySQL的这个timeout是计算从发送sql到等待响应的时间。默认mysql-default_query_timeout是10h。
    retries:语句在执行失败时,重试次数。默认由mysql-query_retries_on_failure变量指定,为1。建议不要重试,有风险。
    delay:查询延迟执行,这是ProxySQL提供的限流机制,会让其它的查询优先执行。
    	默认值mysql-default_query_delay为0。
    mirror_flagOUT,mirror_hostgroup:与镜像相关的设置。
    error_msg:默认为NULL,如果指定了则这个查询直接被block掉,将error_msg返回给客户端。
    multiplex:连接是否利用,请参考文章。
    log:是否记录查询日志,可以看到log是否记录的对象是根据规则。
    	要开启日志记录,需要设置变量mysql-eventslog_filename来指定文件名,然后这个log标记为1。但是目前proxysql记录的日志是二进制格式,需要特定的工具才能读取:
    eventslog_reader_sample。这个工具在源码目录 tools下面。
    

     scheduler调度表

    (admin@127.0.0.1:6032) [main]> show create table schedulerG
    *************************** 1. row ***************************
           table: scheduler
    Create Table: CREATE TABLE scheduler (
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1,
        interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL,
        filename VARCHAR NOT NULL,
        arg1 VARCHAR,
        arg2 VARCHAR,
        arg3 VARCHAR,
        arg4 VARCHAR,
        arg5 VARCHAR,
        comment VARCHAR NOT NULL DEFAULT '')
    1 row in set (0.00 sec)
    id:调度程序作业的唯一标识符。
    active:如果设置为1,则作业处于活动状态。
    interval_ms:工作的开始频率(以毫秒为单位),最小interval_ms为100毫秒。
    filename:可执行文件的完整路径。
    arg1-arg5:传递作业的参数。最多5个。
    comment:注释。

    disk库

    (admin@127.0.0.1:6032) [main]> show tables from disk;
    +------------------------------------+
    | tables                             |
    +------------------------------------+
    | global_variables                   |
    | mysql_collations                   |
    | mysql_group_replication_hostgroups |
    | mysql_query_rules                  |
    | mysql_query_rules_fast_routing     |
    | mysql_replication_hostgroups       |
    | mysql_servers                      |
    | mysql_users                        |
    | proxysql_servers                   |
    | scheduler                          |
    +------------------------------------+
    10 rows in set (0.00 sec)
    ##具体的表介绍和main库一致

    stats库

    (admin@127.0.0.1:6032) [main]> show tables from stats;
    +--------------------------------------+
    | tables                               |
    +--------------------------------------+
    | global_variables                     |
    | stats_memory_metrics                 |
    | stats_mysql_commands_counters        |
    | stats_mysql_connection_pool          |
    | stats_mysql_connection_pool_reset    |
    | stats_mysql_global                   |
    | stats_mysql_prepared_statements_info |
    | stats_mysql_processlist              |
    | stats_mysql_query_digest             |
    | stats_mysql_query_digest_reset       |
    | stats_mysql_query_rules              |
    | stats_mysql_users                    |
    | stats_proxysql_servers_checksums     |
    | stats_proxysql_servers_metrics       |
    | stats_proxysql_servers_status        |
    +--------------------------------------+
    15 rows in set (0.00 sec)

    stats_mysql_commands_counters表

    (admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_commands_countersG
    *************************** 1. row ***************************
           table: stats_mysql_commands_counters
    Create Table: CREATE TABLE stats_mysql_commands_counters (
        Command VARCHAR NOT NULL PRIMARY KEY,
        Total_Time_us INT NOT NULL,
        Total_cnt INT NOT NULL,
        cnt_100us INT NOT NULL,
        cnt_500us INT NOT NULL,
        cnt_1ms INT NOT NULL,
        cnt_5ms INT NOT NULL,
        cnt_10ms INT NOT NULL,
        cnt_50ms INT NOT NULL,
        cnt_100ms INT NOT NULL,
        cnt_500ms INT NOT NULL,
        cnt_1s INT NOT NULL,
        cnt_5s INT NOT NULL,
        cnt_10s INT NOT NULL,
        cnt_INFs)
    1 row in set (0.00 sec)
    command:已执行的SQL命令的类型,如FLUSH、INSERT、KILL、SELECT FOR UPDATE等。
    Total_Time_us:执行该类型命令的总时间(以毫秒为单位)。
    Total_cnt:执行该类型的命令的总数。
    cnt_100us-cnt_INFs:在指定的时间限制内执行的给定类型的命令总数和前一个命令的总数。
    

    stats_mysql_connection_pool表

    (admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_connection_pool G 
    *************************** 1. row ***************************
           table: stats_mysql_connection_pool
    Create Table: CREATE TABLE stats_mysql_connection_pool (
        hostgroup INT,
        srv_host VARCHAR,
        srv_port INT,
        status VARCHAR,
        ConnUsed INT,
        ConnFree INT,
        ConnOK INT,
        ConnERR INT,
        Queries INT,
        Bytes_data_sent INT,
        Bytes_data_recv INT,
        Latency_us INT)
    1 row in set (0.84 sec)
    hostgroup:后端服务器所属的主机组,单个后端服务器可以属于多个主机组。
    srv_host,srv_port:mysqld后端服务器正在侦听连接的TCP端点的IP和Port。
    status:后端服务器的状态。可以有ONLINE,SHUNNED,OFFLINE_SOFT,OFFLINE_HARD。
    ConnUsed:ProxySQL当前使用多少个连接来向后端服务器发送查询。
    ConnFree:目前有多少个连接是空闲。
    ConnOK:成功建立了多少个连接。
    ConnERR:没有成功建立多少个连接。
    Queries:路由到此特定后端服务器的查询数。
    Bytes_data_sent:发送到后端的数据量。
    Bytes_data_recv:从后端接收的数据量。
    Latency_ms:从Monitor报告的当前ping以毫秒为单位的延迟时间。
    

    stats_mysql_global表

    (admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_globalG 
    *************************** 1. row ***************************
           table: stats_mysql_global
    Create Table: CREATE TABLE stats_mysql_global (
        Variable_Name VARCHAR NOT NULL PRIMARY KEY,
        Variable_Value VARCHAR NOT NULL)
    1 row in set (0.09 sec)
    Variable_Name:代表与MySQL相关的代理级别的全局统计
    如Client_Connections_aborted:由于无效凭据或max_connections而导致的前端连接数已达到;
    如Client_Connections_connected:当前连接的前端连接数。
    如Client_Connections_created:到目前为止创建的前端连接数。等等。
    

    stats_mysql_processlist表

    (admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_processlistG
    *************************** 1. row ***************************
           table: stats_mysql_processlist
    Create Table: CREATE TABLE stats_mysql_processlist (
        ThreadID INT NOT NULL,
        SessionID INTEGER PRIMARY KEY,
        user VARCHAR,
        db VARCHAR,
        cli_host VARCHAR,
        cli_port INT,
        hostgroup INT,
        l_srv_host VARCHAR,
        l_srv_port INT,
        srv_host VARCHAR,
        srv_port INT,
        command VARCHAR,
        time_ms INT NOT NULL,
        info VARCHAR)
    1 row in set (0.00 sec)
    ThreadID:ProxySQL线程的内部ID。
    SessionID:ProxySQL会话ID,通过这个ID可以进行kill操作。
    user:与MySQL客户端连接到ProxySQL的用户。
    db:当前选择的数据库。
    cli_host,cli_port:连接ProxySQL的IP和TCP端口。
    hostgroup:当前主机组。如果正在处理查询,则是查询已被路由或将要路由的主机组,或默认主机组。可以通过这个查看该SQL到底是到哪个HG里。
    l_srv_host,l_srv_port:ProxySQL的IP和TCP端口。
    srv_host,srv_port:后端MySQL服务器的IP和端口。
    command:正在执行的MySQL查询的类型。
    time_ms:命令执行的时间(以毫秒为单位)。
    info:正在执行的SQL。
    

    stats_mysql_query_digest表

    (admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_query_digestG
    *************************** 1. row ***************************
           table: stats_mysql_query_digest
    Create Table: CREATE TABLE stats_mysql_query_digest (
        hostgroup INT,
        schemaname VARCHAR NOT NULL,
        username VARCHAR NOT NULL,
        digest VARCHAR NOT NULL,
        digest_text VARCHAR NOT NULL,
        count_star INTEGER NOT NULL,
        first_seen INTEGER NOT NULL,
        last_seen INTEGER NOT NULL,
        sum_time INTEGER NOT NULL,
        min_time INTEGER NOT NULL,
        max_time INTEGER NOT NULL,
        PRIMARY KEY(hostgroup, schemaname, username, digest))
    1 row in set (0.06 sec)
    hostgroup:发送查询的主机组。值-1表示查询查询缓存。
    schemaname:查询的数据库。
    user:连接ProxySQL的用户名。
    digest:一个十六进制散列,表示其参数剥离的SQL。
    digest_text:参数剥离的实际SQL文本
    count_star:执行查询的总次数(参数的值不同)。
    first_seen:unix时间戳,是通过代理路由查询的第一时刻。
    last_seen:unix时间戳,当查询通过代理路由时的最后一刻(到目前为止)。
    sum_time:执行此类查询的总时间(以微秒为单位)。
    这对于确定应用程序工作负载中花费的最多时间在哪里是非常有用的,并为改进的地方提供了一个良好的起点。
    min_time,max_time - 执行此类查询时期望的持续时间范围。
    min_time是到目前为止所看到的最小执行时间,而max_time表示最大执行时间,以微秒为单位。
    

    stats_mysql_query_rules表

    (admin@127.0.0.1:6032) [stats]> show create table stats.stats_mysql_query_rulesG 
    *************************** 1. row ***************************
           table: stats_mysql_query_rules
    Create Table: CREATE TABLE stats_mysql_query_rules (
        rule_id INTEGER PRIMARY KEY,
        hits INT NOT NULL)
    1 row in set (0.00 sec)
    rule_id:路由规则的ID与main.mysql_query_rules的id对应。
    hits:此路由规则的匹配总数。 如果当前传入的查询符合规则,则会记录一次命中。
    

    monitor库
    对后端MySQL的健康检查,由变量mysql-monitor_enabled来确定是否开启Monitor模块。

    (admin@127.0.0.1:6032) [stats]> show tables from monitor;
    +------------------------------------+
    | tables                             |
    +------------------------------------+
    | mysql_server_connect_log           |
    | mysql_server_group_replication_log |
    | mysql_server_ping_log              |
    | mysql_server_read_only_log         |
    | mysql_server_replication_lag_log   |
    +------------------------------------+
    5 rows in set (0.04 sec)

    mysql_server_connect/mysql_server_connect_log表
    连接到所有MySQL服务器以检查它们是否可用,该表用来存放检测连接的日志。由变量mysql-monitor_connect_interval来控制其检测的时间间隔,
    由参数mysql-monitor_connect_timeout控制连接是否超时(默认200毫秒)。

    mysql_server_ping/mysql_server_ping_log表
    使用mysql_ping API ping后端MySQL服务器检查它们是否可用,该表用来存放ping的日志。由变量mysql-monitor_ping_interval控制ping的时间间隔,默认值:10000(毫秒,相当于10秒)

    mysql_server_replication_lag_log表
    后端MySQL服务主从延迟的检测。由参数mysql-monitor_replication_lag_interval控制检测间隔时间, 如果复制滞后太大,可以暂时关闭从。
    由mysql_servers.max_replication_lag列控制。默认值:10000(毫秒,相当于10秒)。

    内置参数
    global_variables 1.4.14版本中有128个参数,参数较多,解释请参考文档
    (admin@127.0.0.1:6032) [monitor]> show variables;

    ProxySQL多层配置设计
    ProxySQL设计模型介绍
    ProxySQL使用多层配置系统,适合满足以下需求:

    允许自动更新配置,与MySQL兼容管理界面;
    允许在线修改配置,不用重启ProxySQL;
    允许回滚配置;
    多层配置系统的实现,如下图:

    +-------------------------+
    |         RUNTIME         |
    +-------------------------+
           /|          |
            |           |
        [1] |       [2] |
            |          |/
    +-------------------------+
    |         MEMORY          |
    +-------------------------+ _
           /|          |      |
            |           |        
        [3] |       [4] |          [5]
            |          |/         
    +-------------------------+  +-------------------------+
    |          DISK           |  |       CONFIG FILE       |
    +-------------------------+  +-------------------------+
    

    RUNTIME代表ProxySQL当前生效的配置,包括global_variables、mysql_servers、mysql_users、mysql_query_rules。无法直接修改这里的配置,必须要从下一层load过来。

    MEMORY(main)代表平时在mysql命令行修改的main里的配置,可以认为是SQLite数据库在内存的镜像。可修改以下:

    mysql_server 后端服务器列表
    mysql_users 连接到ProxySQL的用户列表及其凭据
    mysql_query_rules 将流量路由到不同的后端服务器的规则列表
    global_variables 全局变量列表
    mysql_collat MySQL排序规则列表
    DISK和CONFIG FILE表示磁盘上SQLite数据库,默认位置在$datadir/proxysql.db,在重新启动过程中,内存中未被保存的配置将丢失。
    /etc/proxysql.cnf文件只在第一次初始化的时候用到。如要修改端口,还是需要在管理命令行里修改,再save到磁盘。

    ProxySQL多层配置修改示例
    mysql users

    LOAD MYSQL USERS TO RUNTIME / LOAD MYSQL USERS FROM MEMORY
    SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
    LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
    SAVE MYSQL USERS TO DISK /  SAVE MYSQL USERS FROM MEMORY
    LOAD MYSQL USERS FROM CONFIG
    mysql servers
    
    LOAD MYSQL SERVERS TO RUNTIME   让修改的配置生效
    SAVE MYSQL SERVERS TO MEMORY
    LOAD MYSQL SERVERS TO MEMORY
    SAVE MYSQL SERVERS TO DISK      将修改的配置持久化
    LOAD MYSQL SERVERS FROM CONFIG
    mysql query rules
    
    load mysql query rules to run
    save mysql query rules to mem
    load mysql query rules to mem
    save mysql query rules to disk
    load mysql query rules from config
    mysql variables
    
    load mysql variables to runtime
    save mysql variables to memory
    load mysql variables to memory
    save mysql variables to disk
    load mysql variables from config
    admin variables
    
    load admin variables to runtime
    save admin variables to memory
    load admin variables to memory
    save admin variables to disk
    load admin variables from config
    

    ProxySQL读写分离示例

    添加后端DB服务

    (admin@127.0.0.1:6032) [main]> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values (100,'10.15.7.29',3306,1,'db0,ReadWrite');

    添加访问用户
    登录Master主库设置监控用户和程序用户(由于是测试使用,权限较大,主机允许所有):

    > create user 'monitor'@'%' identified by 'monitor';
    > grant select,super,process,show databases,replication client,replication slave on *.* to 'monitor'@'%';
    > create user 'user0'@'%' identified by 'password0';
    > GRANT SELECT, RELOAD, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES, EXECUTE, SHOW VIEW, TRIGGER, EVENT ON *.* TO 'read0'@'%';

    登录ProxySQL管理端设置

    > INSERT INTO mysql_users (username, password, active, default_hostgroup, max_connections) VALUES ('user0', 'password0', 1, 100, 1000);

    添加复制关系
    登录ProxySQL管理端设置

    > INSERT INTO mysql_replication_hostgroups VALUES(100,101,'db0');
    > load mysql variables to runtime;
    > save mysql variables to disk;
    > SELECT * FROM monitor.mysql_server_read_only_log ORDER BY time_start_us DESC LIMIT 10;

    修改全局变量
    登录ProxySQL管理端设置

    > set mysql-query_retries_on_failure=0;
    > set mysql-max_stmts_per_connection=1000;
    > set mysql-eventslog_filename='queries.log';
    > set mysql-monitor_slave_lag_when_null=7200;
    > set mysql-ping_timeout_server=1500;
    > set mysql-monitor_connect_timeout=1000;
    > set mysql-default_max_latency_ms=2000;
    > set mysql-monitor_username='monitor';
    > set mysql-monitor_password='monitor';
    > set mysql-server_version='5.7.27';

    全局变量生效并保存到磁盘:
    登录ProxySQL管理端设置:

    > load mysql users to runtime;
    > load mysql servers to runtime;
    > load mysql variables to runtime;
    > save mysql users to disk;
    > save mysql servers to disk;
    > save mysql variables to disk;
    > save mysql users to mem;  -- 可以屏蔽看到的明文密码

    路由规则
    ProxySQL使用查询规则来确定路由,如果没有规则用于查询,默认会访问hostgroup 0主机组,会报以下错误

    [root@mysql_slave ~]# mysql -uuser0 -ppassword0 -h 127.0.0.1 -P6033 -e “SELECT 1”
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 9001 (HY000) at line 1: Max connect timeout reached while reaching hostgroup 1 after 2000ms

    设置路由规则:

    > use main;
    > INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, cache_ttl) VALUES (1, '^.*', 101, NULL);
    > INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, cache_ttl) VALUES (1, '^SELECT .* FOR UPDATE', 100, NULL);
    > INSERT INTO mysql_query_rules (active, match_pattern, destination_hostgroup, cache_ttl) VALUES (1, '^SELECT .*', 101, NULL);
    > load mysql query rules to run;
    > save mysql query rules to disk;

    常用查询
    查询连接日志

    (admin@127.0.0.1:6032) [main]> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
    +------------+------+------------------+-------------------------+---------------+
    | hostname   | port | time_start_us    | connect_success_time_us | connect_error |
    +------------+------+------------------+-------------------------+---------------+
    | 10.15.7.29 | 3306 | 1565147207491345 | 1788                    | NULL          |
    | 10.15.7.27 | 3306 | 1565147206844358 | 2356                    | NULL          |
    | 10.15.7.28 | 3306 | 1565147206197450 | 1153                    | NULL          |
    | 10.15.7.28 | 3306 | 1565147147638727 | 39869                   | NULL          |
    | 10.15.7.29 | 3306 | 1565147146917152 | 1191                    | NULL          |
    | 10.15.7.27 | 3306 | 1565147146195486 | 21771                   | NULL          |
    | 10.15.7.27 | 3306 | 1565147087459233 | 1947                    | NULL          |
    | 10.15.7.29 | 3306 | 1565147086827078 | 1496                    | NULL          |
    | 10.15.7.28 | 3306 | 1565147086194835 | 1285                    | NULL          |
    | 10.15.7.27 | 3306 | 1565147027405905 | 1330                    | NULL          |
    +------------+------+------------------+-------------------------+---------------+

    查询ping日志

    (admin@127.0.0.1:6032) [main]> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
    +------------+------+------------------+----------------------+------------+
    | hostname   | port | time_start_us    | ping_success_time_us | ping_error |
    +------------+------+------------------+----------------------+------------+
    | 10.15.7.27 | 3306 | 1565147226243086 | 537                  | NULL       |
    | 10.15.7.29 | 3306 | 1565147226160895 | 697                  | NULL       |
    | 10.15.7.28 | 3306 | 1565147226082449 | 738                  | NULL       |
    | 10.15.7.29 | 3306 | 1565147216308009 | 545                  | NULL       |
    | 10.15.7.28 | 3306 | 1565147216195185 | 32975                | NULL       |
    | 10.15.7.27 | 3306 | 1565147216082403 | 601                  | NULL       |
    | 10.15.7.27 | 3306 | 1565147206248282 | 414                  | NULL       |
    | 10.15.7.28 | 3306 | 1565147206163814 | 425                  | NULL       |
    | 10.15.7.29 | 3306 | 1565147206082325 | 549                  | NULL       |
    | 10.15.7.29 | 3306 | 1565147196274601 | 581                  | NULL       |
    +------------+------+------------------+----------------------+------------+
    10 rows in set (0.00 sec)

    查询后端DB状态

    (admin@127.0.0.1:6032) [main]> SELECT * FROM mysql_servers;
    +--------------+------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
    | hostgroup_id | hostname   | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
    +--------------+------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
    | 1            | 10.15.7.27 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
    | 2            | 10.15.7.27 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
    | 2            | 10.15.7.28 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
    | 1            | 10.15.7.29 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
    | 1            | 10.15.7.28 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
    | 2            | 10.15.7.29 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
    +--------------+------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
    6 rows in set (0.00 sec)

    查询监控状态

    (admin@127.0.0.1:6032) [main]> SELECT * FROM monitor.mysql_server_read_only_log ORDER BY time_start_us DESC LIMIT 10;
    +------------+------+------------------+-----------------+-----------+-------+
    | hostname   | port | time_start_us    | success_time_us | read_only | error |
    +------------+------+------------------+-----------------+-----------+-------+
    | 10.15.7.28 | 3306 | 1565147280195308 | 635             | 0         | NULL  |
    | 10.15.7.27 | 3306 | 1565147280177820 | 571             | 0         | NULL  |
    | 10.15.7.29 | 3306 | 1565147280160274 | 971             | 0         | NULL  |
    | 10.15.7.28 | 3306 | 1565147278681256 | 467             | 0         | NULL  |
    | 10.15.7.29 | 3306 | 1565147278670869 | 491             | 0         | NULL  |
    | 10.15.7.27 | 3306 | 1565147278660435 | 645             | 0         | NULL  |
    | 10.15.7.28 | 3306 | 1565147277182260 | 23757           | 0         | NULL  |
    | 10.15.7.29 | 3306 | 1565147277170779 | 451             | 0         | NULL  |
    | 10.15.7.27 | 3306 | 1565147277160077 | 803             | 0         | NULL  |
    | 10.15.7.28 | 3306 | 1565147275683734 | 537             | 0         | NULL  |
    +------------+------+------------------+-----------------+-----------+-------+
    10 rows in set (0.00 sec)

    查询用户信息

    (admin@127.0.0.1:6032) [main]> SELECT * FROM mysql_users;
    +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
    | username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
    +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
    | proxysql | proxysql | 1      | 0       | 1                 | NULL           | 0             | 1                      | 0            | 1       | 1        | 10000           |
    +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
    1 row in set (0.00 sec)

    查询连接池

    (admin@127.0.0.1:6032) [main]> SELECT * FROM stats.stats_mysql_connection_pool;
    +-----------+------------+----------+--------+----------+----------+--------+---------+---------+-----------------+-----------------+------------+
    | hostgroup | srv_host   | srv_port | status | ConnUsed | ConnFree | ConnOK | ConnERR | Queries | Bytes_data_sent | Bytes_data_recv | Latency_us |
    +-----------+------------+----------+--------+----------+----------+--------+---------+---------+-----------------+-----------------+------------+
    | 1         | 10.15.7.27 | 3306     | ONLINE | 0        | 2        | 2      | 18      | 23      | 645             | 52015           | 582        |
    | 1         | 10.15.7.28 | 3306     | ONLINE | 0        | 0        | 1      | 24      | 130     | 6412            | 556975          | 943        |
    | 1         | 10.15.7.29 | 3306     | ONLINE | 0        | 0        | 0      | 0       | 0       | 0               | 0               | 662        |
    | 2         | 10.15.7.29 | 3306     | ONLINE | 0        | 1        | 1      | 0       | 9       | 153             | 95              | 662        |
    | 2         | 10.15.7.28 | 3306     | ONLINE | 0        | 1        | 1      | 0       | 1       | 17              | 9               | 943        |
    | 2         | 10.15.7.27 | 3306     | ONLINE | 0        | 1        | 1      | 0       | 10      | 188             | 277             | 582        |
    +-----------+------------+----------+--------+----------+----------+--------+---------+---------+-----------------+-----------------+------------+
    6 rows in set (0.00 sec)

    查询执行命令统计信息

    (admin@127.0.0.1:6032) [main]> SELECT * FROM stats_mysql_commands_counters WHERE Total_cnt;
    +-------------------+---------------+-----------+-----------+-----------+---------+---------+----------+----------+-----------+-----------+--------+--------+---------+----------+
    | Command           | Total_Time_us | Total_cnt | cnt_100us | cnt_500us | cnt_1ms | cnt_5ms | cnt_10ms | cnt_50ms | cnt_100ms | cnt_500ms | cnt_1s | cnt_5s | cnt_10s | cnt_INFs |
    +-------------------+---------------+-----------+-----------+-----------+---------+---------+----------+----------+-----------+-----------+--------+--------+---------+----------+
    | ALTER_TABLE       | 33365         | 1         | 0         | 0         | 0       | 0       | 0        | 1        | 0         | 0         | 0      | 0      | 0       | 0        |
    | COMMIT            | 0             | 1         | 1         | 0         | 0       | 0       | 0        | 0        | 0         | 0         | 0      | 0      | 0       | 0        |
    | CREATE_TABLE      | 132150        | 2         | 0         | 0         | 0       | 0       | 0        | 0        | 2         | 0         | 0      | 0      | 0       | 0        |
    | INSERT            | 652776        | 17        | 0         | 0         | 5       | 2       | 2        | 4        | 2         | 2         | 0      | 0      | 0       | 0        |
    | SELECT            | 949845        | 119       | 31        | 5         | 30      | 31      | 3        | 13       | 4         | 2         | 0      | 0      | 0       | 0        |
    | SET               | 249089        | 28        | 5         | 0         | 14      | 4       | 0        | 3        | 2         | 0         | 0      | 0      | 0       | 0        |
    | SHOW_TABLE_STATUS | 35797         | 5         | 0         | 0         | 3       | 1       | 0        | 1        | 0         | 0         | 0      | 0      | 0       | 0        |
    | SHOW              | 2357729       | 110       | 0         | 16        | 34      | 36      | 1        | 11       | 6         | 5         | 1      | 0      | 0       | 0        |
    +-------------------+---------------+-----------+-----------+-----------+---------+---------+----------+----------+-----------+-----------+--------+--------+---------+----------+
    8 rows in set (0.00 sec)

    查询路由规则的详情

    (admin@127.0.0.1:6032) [main]> SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC;
    +-----------+--------------------+----------+--------------------+-----------------------------------------+------------+------------+------------+----------+----------+----------+
    | hostgroup | schemaname         | username | digest             | digest_text                             | count_star | first_seen | last_seen  | sum_time | min_time | max_time |
    +-----------+--------------------+----------+--------------------+-----------------------------------------+------------+------------+------------+----------+----------+----------+
    | 2         | information_schema | proxysql | 0x82A12D4C4E7B0A28 | select @@hostname                       | 17         | 1565143761 | 1565144220 | 107599   | 341      | 95173    |
    | 2         | information_schema | proxysql | 0x630BEE5AF5572801 | select * from db.tb                     | 1          | 1565143743 | 1565143743 | 2157     | 2157     | 2157     |
    | 2         | information_schema | proxysql | 0x620B328FE9D6D71A | SELECT DATABASE()                       | 1          | 1565144104 | 1565144104 | 835      | 835      | 835      |
    | 2         | information_schema | proxysql | 0x3A53616B087A2CBC | select * from test.proxysql_test1       | 1          | 1565143753 | 1565143753 | 828      | 828      | 828      |
    | 1         | test               | proxysql | 0xBD5AB6A13899C7D9 | select * from proxysql_test1 for update | 1          | 1565144119 | 1565144119 | 796      | 796      | 796      |
    | 1         | test               | proxysql | 0x02033E45904D3DF0 | show databases                          | 1          | 1565144104 | 1565144104 | 691      | 691      | 691      |
    | 1         | test               | proxysql | 0x99531AEFF718C501 | show tables                             | 1          | 1565144104 | 1565144104 | 370      | 370      | 370      |
    | 1         | test               | proxysql | 0xDB3A841EF5443C35 | commit                                  | 1          | 1565144130 | 1565144130 | 0        | 0        | 0        |
    | 1         | information_schema | proxysql | 0x594F2C744B698066 | select USER()                           | 1          | 1565143735 | 1565143735 | 0        | 0        | 0        |
    | 1         | information_schema | proxysql | 0x226CD90D52A2BA0B | select @@version_comment limit ?        | 13         | 1565143735 | 1565144220 | 0        | 0        | 0        |
    +-----------+--------------------+----------+--------------------+-----------------------------------------+------------+------------+------------+----------+----------+----------+
    10 rows in set (0.01 sec)
    > SELECT hostgroup hg, sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

    查询路由规则

    (admin@127.0.0.1:6032) [main]> SELECT rule_id, match_digest, match_pattern, replace_pattern, cache_ttl, apply FROM mysql_query_rules ORDER BY rule_id;
    +---------+--------------+----------------------+-----------------+-----------+-------+
    | rule_id | match_digest | match_pattern        | replace_pattern | cache_ttl | apply |
    +---------+--------------+----------------------+-----------------+-----------+-------+
    | 1       | NULL         | ^SELECT.*FOR UPDATE$ | NULL            | NULL      | 1     |
    | 2       | NULL         | ^SELECT              | NULL            | NULL      | 1     |
    +---------+--------------+----------------------+-----------------+-----------+-------+
    2 rows in set (0.00 sec)

    启用Web统计功能

    (admin@127.0.0.1:6032) [main]>  select * from global_variables where variable_name like 'admin-web%';
    +-------------------+----------------+
    | variable_name     | variable_value |
    +-------------------+----------------+
    | admin-web_enabled | false          |
    | admin-web_port    | 6080           |
    +-------------------+----------------+
    启用变量admin-web_enabled
    (admin@127.0.0.1:6032) [main]> set admin-web_enabled='true';
    Query OK, 1 row affected (0.00 sec)
    (admin@127.0.0.1:6032) [main]> load admin variables to runtime;
    Query OK, 0 rows affected (0.00 sec)
    (admin@127.0.0.1:6032) [main]> save admin variables to disk;
    Query OK, 31 rows affected (0.01 sec)
    (admin@127.0.0.1:6032) [main]>  select * from global_variables where variable_name like 'admin-web%';
    +-------------------+----------------+
    | variable_name     | variable_value |
    +-------------------+----------------+
    | admin-web_enabled | true           |
    | admin-web_port    | 6080           |
    +-------------------+----------------+
    查看登录Web界面的用户名、密码和端口
    (admin@127.0.0.1:6032) [main]> select * from global_variables where variable_name like 'admin-web%' or variable_name LIKE 'admin-stats%';
    +-----------------------------------+----------------+
    | variable_name                     | variable_value |
    +-----------------------------------+----------------+
    | admin-stats_credentials           | stats:stats    |
    | admin-stats_mysql_connections     | 60             |
    | admin-stats_mysql_connection_pool | 60             |
    | admin-stats_mysql_query_cache     | 60             |
    | admin-stats_system_cpu            | 60             |
    | admin-stats_system_memory         | 60             |
    | admin-web_enabled                 | true           |
    | admin-web_port                    | 6080           |
    +-----------------------------------+----------------+
    8 rows in set (0.01 sec)

     参考:

    http://idber.github.io/2018/08/28-ProxySQL%20%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3%E5%8F%8A%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E3%80%81%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1.html

  • 相关阅读:
    DetachedCriteria的使用
    Windows 9立即公布了
    加壳学习笔记(三)-简单的脱壳思路&amp;调试思路
    用异或来交换两个变量能提快速度是错误的
    珍爱生命,举手之劳__怎样优雅的叫优步专车
    【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。
    HDU 5311 Hidden String (优美的暴力)
    ChargeSystem——One,Two,Three
    GCC编译uboot出现(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0&#39;错误的解决的方法
    java中commons-beanutils的介绍
  • 原文地址:https://www.cnblogs.com/yhq1314/p/11315379.html
Copyright © 2011-2022 走看看