当前位置:网站首页>TiDB、mysql修改系统变量/常用语句(杀死process中的进程)

TiDB、mysql修改系统变量/常用语句(杀死process中的进程)

2022-06-21 08:21:00 常名先生

-- 查询所有全局变量
SHOW GLOBAL VARIABLES;
-- 查询所有会话变量
SHOW SESSION VARIABLES;

-- 指定查询全局变量
SELECT @@GLOBAL.tidb_retry_limit;
-- 指定查询会话变量
SELECT @@SESSION.tidb_retry_limit;
-- 优先查询会话变量,再查询全局变量
SELECT @@tidb_retry_limit;

-- 修改全局变量
SET GLOBAL 
-- 修改会话变量
SET SESSION 

问题一、(修改sql_mode)

注:同步数据时相关数据库的sql_mode一定要一致否则会出现问题
eg:

drop table if exists t;
create table t(a bigint, b bigint, c bigint);
insert into t values(1, 2, 1), (1, 2, 2), (1, 3, 1), (1, 3, 2);
select distinct a, b from t order by c;

报错:ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'b' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

在 MySQL 中,ORDER BY 表达式需至少满足以下条件之一,否则 DISTINCT 和 ORDER BY 查询将因不合规而被拒绝:

  • 表达式等同于 SELECT 列表中的一个。
  • 表达式引用并属于查询选择表的所有列都是 SELECT 列表的元素。

解决办法:
查看:

SELECT @@GLOBAL.sql_mode 
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

修改去掉ONLY_FULL_GROUP_BY

set @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

问题二、(事务自动重试及带来的异常)

  • 1、tidb_disable_txn_auto_retry 这个变量用来设置是否禁用显式事务自动重试,设置为 on 时,不会自动重试,如果遇到事务冲突需要在应用层重试。默认值:on/1;
    如果将该变量的值设为 off/0,TiDB 将会自动重试事务,这样在事务提交时遇到的错误更少。需要注意的是,这样可能会导致数据更新丢失。
select @@GLOBAL.tidb_disable_txn_auto_retry;
-- SET GLOBAL tidb_disable_txn_auto_retry = 0;
  • 2、tidb_retry_limit 这个变量用来设置最多可重试次数,即在一个事务执行中遇到可重试的错误(例如事务冲突、事务提交过慢或表结构变更)时,这个事务可以被重新执行,这个变量值表明最多可重试的次数。默认值=10
select @@GLOBAL.tidb_retry_limit;
SET GLOBAL tidb_retry_limit = 20
  • 3、tidb_backoff_weight 事务重试时间。TiDB 向 PD 取 TSO 的基础超时时间,默认值:2;(TiDB 向 PD 取 TSO 的基础超时时间是 15 秒),当 tidb_backoff_weight = 2 时基础时间15 * 2 等于 30 秒。
select @@GLOBAL.tidb_backoff_weight;
-- SET GLOBAL tidb_backoff_weight = 1

问题三、(设置悲观锁tidb_txn_mode)

tidb_txn_mode
作用域:SESSION(自 TiDB 3.0.4 起支持 GLOBAL)
默认值:””

  • 这个变量用于设置事务模式,默认是乐观锁模式。TiDB 3.0 加入了悲观锁模式(实验性)。将 tidb_txn_mode 设置为 ‘pessimistic’ 后,这个 session 执行的所有显式事务(即非 autocommit 的事务)都会进入悲观事务模式。
  • 自 TiDB 3.0.4 起,该变量也支持 GLOBAL 作用域,用于设定全局的事务模式。当设定全局的事务模式时,仅在修改生效之后创建的 session 会受到影响。

SESSION作用当前修改的tidb-server

select @@GLOBAL.tidb_txn_mode
select @@SESSION.tidb_txn_mode

设置成悲观锁

set @@global.tidb_txn_mode = 'pessimistic';
-- SET SESSION tidb_txn_mode = ''

有关悲观锁的问题请参考此文章
测试脚本

问题四、

INFORMATION_SCHEMA.SLOW_QUERY, 慢查询日志里的query语句太长,不能显示完整的 SQL语句

[[email protected] tidb-ansible]$ vim /home/tidb/tidb-ansible/conf/tidb.yml
......
log:
  # Log level: debug, info, warn, error, fatal.
  # level: "info"

  # Log format, one of json, text, console.
  # format: "text"

  # Disable automatic timestamps in output
  # disable-timestamp: false

  # Queries with execution time greater than this value will be logged. (Milliseconds)
  # slow-threshold: 300

  # Queries with internal result greater than this value will be logged.
  # expensive-threshold: 10000

  # Maximum query length recorded in log.
  # query-log-max-len: 2048
  query-log-max-len: 20480
......
[[email protected] tidb-ansible]$
[[email protected] tidb-ansible]$
# 滚动更新以后,后续收集的语句就可以显示全部了
[[email protected] tidb-ansible]$ ansible-playbook rolling_update.yml

Congrats! All goes well. :-)
[[email protected] tidb-ansible]$

问题五、(开启大事务

1、tidb_batch_insert(开启insert大事务)
作用域:SESSION

默认值:0

这个变量用来设置是否自动切分插入数据。仅在 autocommit 开启时有效。 当插入大量数据时,可以将其设置为 1,这样插入数据会被自动切分为多个 batch,每个 batch 使用一个单独的事务进行插入。 该用法破坏了事务的原子性和隔离性,使用该特性时,使用者需要保证没有其他对正在处理的表的任何操作,并且在出现报错时,需要及时人工介入,检查数据的一致性和完整性。因此,不建议在生产环境中使用。

select @@SESSION.tidb_batch_insert
SET SESSION tidb_batch_insert = '1'

2、tidb_batch_delete(开启delete大事务)
作用域:SESSION

默认值:0

这个变量用来设置是否自动切分待删除的数据。仅在 autocommit 开启,并且是单表删除的 SQL 时有效。关于单表删除的 SQL 的定义,详见 DELETE Syntax。 当删除大量数据时,可以将其设置为 1,这样待删除数据会被自动切分为多个 batch,每个 batch 使用一个单独的事务进行删除。 该用法破坏了事务的原子性和隔离性,使用该特性时,使用者需要保证没有其他对正在处理的表的任何操作,并且在出现报错时,需要及时人工介入,检查数据的一致性和完整性。因此,不建议在生产环境中使用。

配置整条 SQL 的内存使用阈值

官方参数参考
官方书籍位置
修改一个尽量所有有关tidb_mem_*都改变下

SELECT @@tidb_mem_quota_query
设置为1G
set @@tidb_mem_quota_query=1073741824

语句最长执行时间,单位为毫秒。默认值 (0) 表示无限制。

select @@GLOBAL.max_execution_time;

tidb4.0

更改配置文件的时候参考对应版本的配置参数

tidb配置

tiup cluster display test-cluster
tiup cluster edit-config test-cluster
tiup cluster reload test-cluster -N 172.168.192.33:4000

1、TiDB 单个事务允许的最大语句条数限制。

4.0官方参考

  • stmt-count-limit
    TiDB 单个事务允许的最大语句条数限制。
    默认值:5000
    在一个事务中,超过 stmt-count-limit 条语句后还没有 rollback 或者 commit,TiDB 将会返回 statement count 5001 exceeds the transaction limitation, autocommit = false 错误。该限制只在可重试的**乐观事务**中生效,如果使用悲观事务或者关闭了事务重试,事务中的语句数将不受此限制。

解决方式参考问题2、3

2、调整TiDB 单个事务大小限制

报错:
Transaction is too large, size: 104857600;

可以调整如下参数

  • txn-total-size-limit
    TiDB 单个事务大小限制
    默认值:104857600 (Byte)/100M
    单个事务中,所有 key-value 记录的总大小不能超过该限制。该配置项的最大值不超过 10737418240(表示 10GB)。注意,如果使用了以 Kafka 为下游消费者的 binlog,如:arbiter 集群,该配置项的值不能超过 1073741824(表示 1GB),因为这是 Kafka 的处理单条消息的最大限制,超过该限制 Kafka 将会报错。

3、 单个事务持锁的最长时间max-txn-ttl

报错:
TTL manager has timed out, pessimistic locks may expire, please commit or rollback this transaction

  • max-txn-ttl
    单个事务持锁的最长时间,超过该时间,该事务的锁可能会被其他事务清除,导致该事务无法成功提交。
    默认值:600000
    单位:毫秒
    超过此时间的事务只能执行提交或者回滚,提交不一定能够成功。

优化参数建议:

Join 算子优化

  • tidb_distsql_scan_concurrency
    作用域:SESSION | GLOBAL
    默认值:15
    这个变量用来设置 scan 操作的并发度。
    AP 类应用适合较大的值,TP 类应用适合较小的值。对于 AP 类应用,最大值建议不要超过所有 TiKV 节点的 CPU 核数。
--设置GLOBAL作用域
mysql> set @@global.tidb_distsql_scan_concurrency=30;
  • tidb_index_lookup_size
    作用域:SESSION | GLOBAL
    默认值:20000
    含义:该变量用来设置 index lookup 操作的 batch 大小,AP 类应用适合较大的值,TP 类应用适合较小的值,SQL设置具体示例如下:
--设置GLOBAL作用域
mysql> set @@global.tidb_index_lookup_size=40000;
  • tidb_index_lookup_concurrency
    作用域:SESSION | GLOBAL
    默认值:4
    含义:该变量用来设置 index lookup 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值,SQL设置具体示例如下
--设置GLOBAL作用域
mysql> set @@global.tidb_index_lookup_concurrency=8;
  • tidb_index_lookup_join_concurrency
    作用域:SESSION | GLOBAL
    默认值:4
    含义:该变量用来设置 index lookup join 算法的并发度,SQL设置具体示例如下:
mysql> set @@global.tidb_index_lookup_join_concurrency=8;
  • tidb_hash_join_concurrency
    作用域:SESSION | GLOBAL
    默认值:5
    含义:该变量用来设置 hash join 算法的并发度,SQL设置具体示例如下:
mysql> set @@global.tidb_hash_join_concurrency=10;
  • tidb_index_serial_scan_concurrency
    作用域:SESSION | GLOBAL
    默认值:1
    含义:该变量用来设置顺序 scan 操作的并发度,AP 类应用适合较大的值,TP 类应用适合较小的值,SQL设置具体示例如下:
mysql> set @@global.tidb_index_serial_scan_concurrency=4;

杀死process中的进程

例子

mysql> SHOW PROCESSLIST;
+------+------+-----------+------+---------+------+-------+------------------+
| Id   | User | Host      | db   | Command | Time | State | Info             |
+------+------+-----------+------+---------+------+-------+------------------+
|    1 | root | 127.0.0.1 | test | Query   |    0 | 2     | SHOW PROCESSLIST |
|    2 | root | 127.0.0.1 |      | Sleep   |    4 | 2     |                  |
+------+------+-----------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

mysql> KILL TIDB 2;
Query OK, 0 rows affected (0.00 sec)

根据设计,该语句默认情况下与MySQL不兼容。这有助于防止在错误的TiDB服务器上终止连接的情况,因为通常将多个TiDB服务器放置在负载均衡器后面。
mysql使用方法

KILL [CONNECTION | QUERY] thread_id

TiDB 中窗口函数的使用方法与 MySQL 8.0 基本一致,详情可参见 MySQL 窗口函数。由于窗口函数会使用一些保留关键字,可能导致原先可以正常执行的 SQL 语句在升级 TiDB 后无法被解析语法,此时可以将 tidb_enable_window_function 设置为 0,该参数的默认值为 1。

原网站

版权声明
本文为[常名先生]所创,转载请带上原文链接,感谢
https://blog.csdn.net/jiangbenchu/article/details/103403366