# 如何对租户参数（或变量）进行设置 

## 通过 SYS 租户修改业务租户参数 

上一课介绍到 OceanBase 集群参数设置，其中有部分参数生效范围是租户（`TENANT`）。在 OceanBase 内部租户（`sys`）里，可以修改业务实例的部分参数。比如说参数 `writing_throttling_trigger_percentage` 用于对指定租户进行内存限流（增量内存使用率达到这个阈值就对写入降速）。

```sql

MySQL [oceanbase]> show parameters like 'writing_throttling_trigger_percentage%'\G
*************************** 1. row ***************************
      zone: zone1
  svr_type: observer
    svr_ip: 172.20.249.50
  svr_port: 2882
      name: writing_throttling_trigger_percentage
 data_type: NULL
     value: 100
      info: the threshold of the size of the mem store when writing_limit will be triggered. Rang:(0, 100]. setting 100 means turn off writing limit
   section: TRANS
     scope: TENANT
    source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
1 row in set (0.002 sec)

MySQL [oceanbase]> alter system set writing_throttling_trigger_percentage = 90 tenant='obmysql';
Query OK, 0 rows affected (0.011 sec)

```

这个修改后的值，只能在对应租户里查看。

```bash
[admin@obce00 ~]$ mysql -h 172.20.249.50 -u root@obmysql -P 2881 -p -c -A oceanbase
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3221538749
Server version: 5.7.25 OceanBase 3.1.0 (r3-b20901e8c84d3ea774beeaca963c67d7802e4b4e) (Built Aug 10 2021 08:10:38)

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 [oceanbase]> show parameters like 'writing_throttling_trigger_percentage%'\G
*************************** 1. row ***************************
      zone: zone1
  svr_type: observer
    svr_ip: 172.20.249.50
  svr_port: 2882
      name: writing_throttling_trigger_percentage
 data_type: NULL
     value: 90
      info: the threshold of the size of the mem store when writing_limit will be triggered. Rang:(0, 100]. setting 100 means turn off writing limit
   section: TRANS
     scope: TENANT
    source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
1 row in set (0.004 sec)
```

## 修改业务租户参数

当然，在业务租户里，也可以自己设置参数。比如说还有个参数 `writing_throttling_maximum_duration` 是控制增量内存剩余内存根据当前写入速度预估还能支撑多久。这个参数仅供参考，准确性不及上面那个参数。

```sql
# 业务租户里改参数，后面就不需要指定租户名。
MySQL [oceanbase]> alter system set writing_throttling_maximum_duration = '2h';
Query OK, 0 rows affected (0.006 sec)

MySQL [oceanbase]> show parameters like 'writing_throttling_maximum_duration'\G
*************************** 1. row ***************************
      zone: zone1
  svr_type: observer
    svr_ip: 172.20.249.50
  svr_port: 2882
      name: writing_throttling_maximum_duration
 data_type: NULL
     value: 2h
      info: maximum duration of writing throttling(in minutes), max value is 3 days
   section: TRANS
     scope: TENANT
    source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
1 row in set (0.004 sec)
```

## 修改业务租户变量

OceanBase 租户还有一个 叫变量（`VARIABLE`）的设计，这个跟 MySQL 实例很像。变量其实就是租户的参数。可以在租户全局层面修改，也可以会话层面修改。很多变量还有对应的 SQL HINT，在语句级别修改。
全局层面的修改影响的是后续的会话，会话层面的修改仅影响当前会话，语句级别的修改只影响当前语句。

OceanBase 租户在刚开始使用的时候，建议调大租户的几个超时参数。
+ `ob_query_timeout` : 语句执行超时时间，单位 `us`， 默认值是 10000000 （也就是 10 秒）。建议根据业务SQL 平均执行时间水平调整。 OLTP场景调整短一些，OLAP场景调整大一些。初学者建议调大 10 倍。
+ `ob_trx_idle_timeout` ： 事务空闲超时时间，单位 `us`， 默认值是 120000000（也就是 120 秒）。建议根据业务事务平均空闲时间水平调整。空闲事务会占用连接、可能持有锁不释放，导致高并发时阻塞和死锁概率增加。不建议调大。
+ `ob_trx_timeout` ：事务未提交超时时间，单位 `us`，默认值是 100000000 （也就是 100 秒）。建议根据业务事务平均持续时间水平调整。事务长期不提交，会占用连接、可能持有锁不释放，导致高并发时阻塞和死锁概率增加。不建议调大。如果是后台跑批业务，建议在会话级别调大。
+ `ob_trx_lock_timeout`：事务申请加锁等待超时时间，单位 `us`，默认值是 -1（也就是不控制。超时依然会受 `ob_query_timeout` 限制。）。当调大了语句超时时间变量（`ob_query_timeout`）后，可以将这个锁等待超时改为 10000000 （即 10s）。减少阻塞和死锁的概率。


变量查看和修改方法语法：

```sql
show global | session variables like '%变量名部分字段%' ;

set global | session 变量名 =  '变量值' ;
```

示例：

```sql

MySQL [oceanbase]> show global variables like '%timeout%';
+---------------------+------------------+
| Variable_name       | Value            |
+---------------------+------------------+
| connect_timeout     | 10               |
| interactive_timeout | 28800            |
| lock_wait_timeout   | 31536000         |
| net_read_timeout    | 30               |
| net_write_timeout   | 60               |
| ob_pl_block_timeout | 3216672000000000 |
| ob_query_timeout    | 10000000         |
| ob_trx_idle_timeout | 120000000        |
| ob_trx_lock_timeout | -1               |
| ob_trx_timeout      | 100000000        |
| wait_timeout        | 28800            |
+---------------------+------------------+
11 rows in set (0.002 sec)

MySQL [oceanbase]> set global ob_query_timeout = 100000000;
Query OK, 0 rows affected (0.015 sec)

MySQL [oceanbase]> set global ob_trx_timeout = 1000000000;
Query OK, 0 rows affected (0.014 sec)

MySQL [oceanbase]> set global ob_trx_idle_timeout = 1200000000;
Query OK, 0 rows affected (0.010 sec)

MySQL [oceanbase]> SET GLOBAL ob_trx_lock_timeout=10000000;
Query OK, 0 rows affected (0.011 sec)

```

对于复杂的 SQL 场景，或者 OLAP 场景，租户还需要调整一个变量 `ob_sql_work_area_percentage` 。这个影响 SQL 里排序统计能利用的内存大小。可以看情况调整。

```sql
set global ob_sql_work_area_percentage=50;

```

## 通过 SYS 租户修改业务租户变量

但是有部分变量属于租户初始化变量，不能在业务租户里直接修改。需要在 SYS 租户里修改。

示例：

```sql
[qing.meiq@xinren-oms.eu95 /home/qing.meiq/mysqldata]
$ mysql -h127.1 -uroot@obmysql#obdemo -P2883 -p123456 -c -A oceanbase -Ns
MySQL [oceanbase]> set global lower_case_table_names=0;
ERROR 1238 (HY000): Variable 'lower_case_table_names' is a read only variable
MySQL [oceanbase]>
[qing.meiq@xinren-oms.eu95 /home/qing.meiq/mysqldata]
$mysql -h127.1 -uroot@sys#obdemo -P2883 -p123456 -c -A oceanbase -Ns
MySQL [oceanbase]> alter tenant obmysql set variables lower_case_table_names=0;
MySQL [oceanbase]>
[qing.meiq@xinren-oms.eu95 /home/qing.meiq/mysqldata]
$ mysql -h127.1 -uroot@obmysql#obdemo -P2883 -p123456 -c -A oceanbase -Ns
MySQL [oceanbase]> show global variables like 'lower_case_table_names';
lower_case_table_names  0
MySQL [oceanbase]>
```

有个变量比较特殊，初始化租户的时候在 SYS 租户设置，后期可以在业务租户里修改。如变量 `ob_tcp_invited_nodes` ，表示租户访问 IP 白名单。

```sql
set global ob_tcp_invited_nodes='11.166.0.0/16,127.0.0.1';
```

如果业务租户设置错误导致无法登录时，还可以通过 SYS 租户再改回正确值。

还有个变量比较特殊，不允许后期更改。如变量 `ob_compatibility_mode` 表示租户兼容性。这个在租户创建时指定，后期不能修改。

