Debian JessieにMariaDBサーバー10.0.30をインストールし、最大キー長を増やしようとしました。 AFAIUそれは設定パラメータに依存しますinnodb_large_prefix
有効化されています。 docs によると、barracuda
ファイル形式とinnodb_file_per_table
。 configで設定し、クライアントでサーバーを再起動すると、これらのパラメーターが正しく設定されていることがわかります。
> SHOW GLOBAL VARIABLES LIKE 'innodb_large%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| innodb_large_prefix | ON |
+---------------------+-------+
1 row in set (0.00 sec)
> SHOW GLOBAL VARIABLES LIKE 'innodb_file%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | OFF |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)
> SHOW GLOBAL VARIABLES LIKE 'innodb_page%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)
わからない、なぜinnodb_file_format_max
はAntelope
に設定されますが、innodb_file_format_check
はOFFであり、問題ではありません。実際、Barracuda
も設定していても、違いはありませんでした。
私が今のような大きなインデックスを持つテーブルを作成しようとすると:
CREATE TABLE `some_table` (
`some_tableID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`column` varchar(750) COLLATE utf8mb4_estonian_ci NOT NULL DEFAULT '',
PRIMARY KEY (`some_tableID`),
KEY `column` (`column`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_estonian_ci;
エラーが発生します:
ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
Ubuntu 16.04では、mysqlサーバー5.7.17はすべて関連する設定が同じで(デフォルト)、大きなインデックスで問題はありません(utf8mb4の場合、750 * 4 = 3000です)。
MariaDBのセットアップの何が問題になっていますか?
これらの2つの設定以上のものが必要です...
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- or COMPRESSED
おそらく、必要なのはROW_FORMAT=...
あなたのCREATE TABLE
。
これらの手順は、5.6.3から5.7.7までに必要です。 5.7.7から、システムはデフォルトでより大きなフィールドを正しく処理します。
あるいは、「プレフィックス」インデックスを使用できます。
INDEX(column(191))
(しかし、接頭辞の索引付けには多くの点で欠陥があります。)
「サーバーが後でより高いテーブル形式を作成する場合、innodb_file_format_maxはその値に設定されます」は、その設定が問題ではないことを意味します。
innodb_large_prefix
は、COMPRESSED
およびDYNAMIC
行形式にのみ適用されます。
MariaDB 10.0および10.1にはInnoDB 5.6があり、デフォルトではROW_FORMAT=Compact
でテーブルを作成します(innodb_file_format
がBarracuda
に設定されている場合でも)。そのため、大きなプレフィックスを使用するには、行形式を明示的に指定する必要があります。 MySQL 5.6についても同様です。
InnoDB 5.7はデフォルトでROW_FORMAT=DYNAMIC
を使用してテーブルを作成します。これが、innodb_large_prefix
に依存する同じCREATE
が追加の句なしでMySQL 5.7およびMariaDB 10.2で機能する理由です。
セッションの解決策はここで答えられると思いますが、MySQLを再起動すると、これらの設定は機能しないと思います。
永続的な解決策として、My.Iniファイルに次のコードを入力する必要があります。
## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'
やり直しや頭の傷の軽減に役立つことを願っています:)
@Rickが提供するステップの後:
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
SET GLOBAL innodb_large_prefix=1;
-- logout & login (to get the global values);
最後のステップを
SET GLOBAL innodb_default_row_format=DYNAMIC;
ここまでは順調ですね。