web-dev-qa-db-ja.com

MariaDB-my.cnfからmax_connectionsとwait_timeoutを設定できません

/etc/my.cnfでmax_connectionsおよびwait_timeoutパラメーターを設定するのに苦労していますが、MariaDBがファイルからパラメーターを読み取っていないようです(他のパラメーターの一部を読み取りますが、すべてチェックしていません)。

私の/etc/my.cnfファイル:

[mysqld]
#skip-grant-tables
datadir=/data/mysql
socket=/data/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# network
connect_timeout = 61
wait_timeout = 86400
max_connections = 100000
max_allowed_packet = 64M
max_connect_errors = 1000

# limits
tmp_table_size = 512M
max_heap_table_size = 256M
table_cache = 512

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

[client]
port = 3306
socket= /data/mysql/mysql.sock

しかし、MariaDBでmax_connections変数とwait_timeout変数を確認すると、デフォルト値が表示されます。

MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 214   |
+-----------------+-------+
1 row in set (0.00 sec)

MariaDB [(none)]> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

ただし、my.cnfの他のパラメーターは正しいです。

MariaDB [(none)]> show variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 67108864 |
+--------------------+----------+
1 row in set (0.00 sec)


MariaDB [(none)]> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 1000  |
+--------------------+-------+
1 row in set (0.00 sec)

MariaDB [(none)]> show variables like 'connect_timeout';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| connect_timeout | 61    |
+-----------------+-------+
1 row in set (0.00 sec)

Mysqlコマンドラインからmax_connections変数を設定できますが、サービスを再起動すると自動的にリセットされます。

MariaDB [(none)]> set global max_connections := 10000;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
1 row in set (0.00 sec)

しかし、wait_timeoutの場合、これは機能しません。

MariaDB [(none)]> set global wait_timeout = 86400;                                                                            Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show variables like 'wait_timeout';                                                                         +---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

待機タイムアウトはセッション変数として設定されます。

MariaDB [(none)]> SELECT * FROM information_schema.global_variables WHERE variable_name='wait_timeout' UNION SELECT * FROM information_schema.session_variables WHERE variable_name='wait_timeout';
+---------------+----------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+----------------+
| WAIT_TIMEOUT  | 86400          |
| WAIT_TIMEOUT  | 28800          |
+---------------+----------------+
2 rows in set (0.00 sec)

すべてのmy.cnfファイルを確認しましたが、どれもパラメータを上書きしていません。

[/] # locate my.cnf
/etc/my.cnf
/etc/my.cnf.d
/etc/my.cnf~
/etc/my.cnf.d/client.cnf
/etc/my.cnf.d/mysql-clients.cnf
/etc/my.cnf.d/server.cnf
/root/.my.cnf

OS:RHEL 7

MariaDBバージョン:mariadb-server-5.5.47-1.el7_2.x86_64

6
Iokanaan Iokan

wait_timeoutはねじボールの1つです。

「スレッドの起動時に、セッションのwait_timeout値は、クライアントのタイプ(mysql_real_connect()へのCLIENT_INTERACTIVE接続オプションで定義されている)に応じて、グローバルのwait_timeout値またはグローバルのinteractive_timeout値から初期化されます。interactive_timeoutも参照してください。」

max_connectionsは上限が100000であると主張していますが、10000でも不当に大きいと言えます。 max_connections=1000my.cnf

My.cnfを変更した後、

  1. mysqldを再起動します
  2. 切断して再接続し、変更を確認します
  3. 使用する SHOW GLOBALSHOWではなく、デフォルトでSHOW SESSION

GLOBALSESSIONVARIABLESSTATUSの両方)の相互作用は、設定によって異なります。すべてではない多くの場合、セッションは初期化されたときにグローバルにログインする。そしてwait_timeoutはおそらく最も風変わりです。

警告

たとえば、3つのtmpテーブルを必要とする複雑なSELECTsを実行する接続ごとに100000の接続がある場合、100000 * 3 * 256M = 76.8TBの[〜#〜] ramが必要になる可能性があります[〜#〜]tmpテーブルを処理します! (256M = min(tmp_table_size、max_heap_table_size))。これは、これらすべてのものを非常に高く設定するではない強力な理由です。

10
Rick James