MySQL从5.7.6开始支持Rewrite plugin插件,可以将符合条件的SQL语句进行改写。
安装插件
 
1
 2
 3
 4
 5
 6
 7
 8
 9
  
[root@t-luhx03-v-szzb share]# mysql -uroot -p < /usr/local/mysql/share/install_rewriter.sql
 Enter password: 
 
 root@test 09:45:  SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
 +------------------+-------+
 | Variable_name    | Value |
 +------------------+-------+
 | rewriter_enabled | ON    |
 +------------------+-------+
  
 
脚本会创建一个query_rewrite的数据库,其中包含一张rewrite_rules的表,用于定义并管理重写的规则 
测试改写效果
 插入规则 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
  
root@(none) 09:55:  insert into query_rewrite.rewrite_rules(pattern,replacement,pattern_database) values ("select * from tab1 where id=?","select * from tab1 where name='lu'","test");
 Query OK, 1 row affected (0.01 sec)
 
 root@(none) 10:02:  select * from query_rewrite.rewrite_rules\G
 *************************** 1. row ***************************
                 id: 1
            pattern: select * from tab1 where id=?
   pattern_database: test
        replacement: select * from tab1 where name='lu'
            enabled: YES
            message: NULL
     pattern_digest: NULL
 normalized_pattern: NULL
  
 
重新加载 
1
  
root@(none) 10:02:  call query_rewrite.flush_rewrite_rules();
  
 
验证效果 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
  
root@test 10:04:  select * from tab1;
 +----+------------+------+
 | id | name       | comm |
 +----+------------+------+
 |  1 | lu         | NULL |
 |  2 | heng       | NULL |
 |  3 | xing       | NULL |
 |  4 | luhengxing | NULL |
 +----+------------+------+
 4 rows in set (0.00 sec)
 
 root@test 10:04:  select * from tab1 where id=2;
 +----+------+------+
 | id | name | comm |
 +----+------+------+
 |  1 | lu   | NULL |
 +----+------+------+
 1 row in set, 1 warning (0.00 sec)
 
 root@test 10:04:  show warnings\G
 *************************** 1. row ***************************
   Level: Note
    Code: 1105
 Message: Query 'select * from tab1 where id=2' rewritten to 'select * from tab1 where name='lu'' by a query rewrite plugin
 1 row in set (0.01 sec)
  
 
禁用规则 
1
 2
 3
 4
 5
 6
  
root@test 10:08:  UPDATE query_rewrite.rewrite_rules SET enabled = 'NO' WHERE id = 1;
 Query OK, 1 row affected (0.02 sec)
 Rows matched: 1  Changed: 1  Warnings: 0
 
 root@test 10:11:  CALL query_rewrite.flush_rewrite_rules();
 Query OK, 0 rows affected (0.01 sec)
  
 
参考链接
 
Using the Rewriter Query Rewrite Plugin  
 
 
    
    
    
    
    
        
   
   
   
 
        Licensed under CC BY-NC-SA 4.0