MariaDB のBLOB型について
先日、MariaDB の BLOG 項目を持つテーブルにデータを登録しようとすると、エラーが発生して失敗してしまった。
今回は、その解決方法などについて説明する。
どんなエラーが起きたのか
2055: lost connection to mysql server at ‘/var/lib/mysql/mysql.sock’, system error: 32 broken pipe
要するにソケットが壊れて通信に失敗したらしい。
意味不明である。
結局色々と調べてみるもよく判らなかったのだが、パイプが壊れるのは BLOB を持つレコードだけだったので、BLOB に登録するデータサイズを変えて試してみると、ある程度以下なら成功するらしい。
結果として、何かの上限に達している可能性が高いので色々と調べてみると次のパラメータを発見した。
MariaDB [(none)]> show variables like 'max_%'; +----------------------------+----------------------+ | Variable_name | Value | +----------------------------+----------------------+ | max_allowed_packet | 26214400 | | max_binlog_cache_size | 18446744073709547520 | | max_binlog_size | 1073741824 | | max_binlog_stmt_cache_size | 18446744073709547520 | | max_connect_errors | 100 | | max_connections | 151 | | max_delayed_threads | 20 | | max_digest_length | 1024 | | max_error_count | 64 | | max_heap_table_size | 16777216 | | max_insert_delayed_threads | 20 | | max_join_size | 18446744073709551615 | | max_length_for_sort_data | 1024 | | max_password_errors | 4294967295 | | max_prepared_stmt_count | 16382 | | max_recursive_iterations | 4294967295 | | max_relay_log_size | 1073741824 | | max_rowid_filter_size | 131072 | | max_seeks_for_key | 4294967295 | | max_session_mem_used | 9223372036854775807 | | max_sort_length | 1024 | | max_sp_recursion_depth | 0 | | max_statement_time | 0.000000 | | max_tmp_tables | 32 | | max_user_connections | 0 | | max_write_lock_count | 4294967295 | +----------------------------+----------------------+ 26 rows in set (0.002 sec)
一番臭いのは「max_allowed_packet」だ。日本語にすれば「パケットの最大サイズ」となるのだが。これを変更してみる。
「mariadb-server.cnf」
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
character-set-server = utf8
max_allowed_packet=25M
そしてもう一度登録してみると、成功した。
うん、コレっぽいね。
ちなみに MariaDB の LONGBLOB (up to 4GB) とあるので、最大格納サイズは 4Gbyte である。