web-dev-qa-db-ja.com

Amazon AWS RDS Aurora行サイズが大きすぎます(VB5)

私たちはvbulletin 5データベースをRDS /Auroraにインポートして、これを取得しようとしています:

行5733のエラー1118(42000):行サイズが大きすぎます(> 8126)。一部の列をTEXTまたはBLOBに変更するか、ROW_FORMAT = DYNAMICまたはROW_FORMAT = COMPRESSEDを使用すると役立つ場合があります。現在の行形式では、768バイトのBLOBプレフィックスがインラインで格納されます。

これは、失敗している挿入のテーブル構造です。

DROP TABLE IF EXISTS `language`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `language` (
  `languageid` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL DEFAULT '',
  `userselect` smallint(5) unsigned NOT NULL DEFAULT '1',
  `options` smallint(5) unsigned NOT NULL DEFAULT '1',
  `languagecode` varchar(12) NOT NULL DEFAULT '',
  `charset` varchar(15) NOT NULL DEFAULT '',
  `imagesoverride` varchar(150) NOT NULL DEFAULT '',
  `dateoverride` varchar(50) NOT NULL DEFAULT '',
  `timeoverride` varchar(50) NOT NULL DEFAULT '',
  `registereddateoverride` varchar(50) NOT NULL DEFAULT '',
  `calformat1override` varchar(50) NOT NULL DEFAULT '',
  `calformat2override` varchar(50) NOT NULL DEFAULT '',
  `logdateoverride` varchar(50) NOT NULL DEFAULT '',
  `locale` varchar(20) NOT NULL DEFAULT '',
  `decimalsep` char(1) NOT NULL DEFAULT '.',
  `thousandsep` char(1) NOT NULL DEFAULT ',',
  `phrasegroup_global` mediumtext,
  `phrasegroup_cpglobal` mediumtext,
  `phrasegroup_cppermission` mediumtext,
  `phrasegroup_forum` mediumtext,
  `phrasegroup_calendar` mediumtext,
  `phrasegroup_attachment_image` mediumtext,
  `phrasegroup_style` mediumtext,
  `phrasegroup_logging` mediumtext,
  `phrasegroup_cphome` mediumtext,
  `phrasegroup_promotion` mediumtext,
  `phrasegroup_user` mediumtext,
  `phrasegroup_help_faq` mediumtext,
  `phrasegroup_sql` mediumtext,
  `phrasegroup_subscription` mediumtext,
  `phrasegroup_language` mediumtext,
  `phrasegroup_bbcode` mediumtext,
  `phrasegroup_stats` mediumtext,
  `phrasegroup_diagnostic` mediumtext,
  `phrasegroup_maintenance` mediumtext,
  `phrasegroup_profilefield` mediumtext,
  `phrasegroup_thread` mediumtext,
  `phrasegroup_timezone` mediumtext,
  `phrasegroup_banning` mediumtext,
  `phrasegroup_reputation` mediumtext,
  `phrasegroup_wol` mediumtext,
  `phrasegroup_threadmanage` mediumtext,
  `phrasegroup_pm` mediumtext,
  `phrasegroup_cpuser` mediumtext,
  `phrasegroup_accessmask` mediumtext,
  `phrasegroup_cron` mediumtext,
  `phrasegroup_moderator` mediumtext,
  `phrasegroup_cpoption` mediumtext,
  `phrasegroup_cprank` mediumtext,
  `phrasegroup_cpusergroup` mediumtext,
  `phrasegroup_holiday` mediumtext,
  `phrasegroup_posting` mediumtext,
  `phrasegroup_poll` mediumtext,
  `phrasegroup_fronthelp` mediumtext,
  `phrasegroup_register` mediumtext,
  `phrasegroup_search` mediumtext,
  `phrasegroup_showthread` mediumtext,
  `phrasegroup_postbit` mediumtext,
  `phrasegroup_forumdisplay` mediumtext,
  `phrasegroup_messaging` mediumtext,
  `phrasegroup_inlinemod` mediumtext,
  `phrasegroup_hooks` mediumtext,
  `phrasegroup_cprofilefield` mediumtext,
  `phrasegroup_reputationlevel` mediumtext,
  `phrasegroup_infraction` mediumtext,
  `phrasegroup_infractionlevel` mediumtext,
  `phrasegroup_notice` mediumtext,
  `phrasegroup_prefix` mediumtext,
  `phrasegroup_prefixadmin` mediumtext,
  `phrasegroup_album` mediumtext,
  `phrasegroup_socialgroups` mediumtext,
  `phrasegroup_advertising` mediumtext,
  `phrasegroup_tagscategories` mediumtext,
  `phrasegroup_contenttypes` mediumtext,
  `phrasegroup_vbblock` mediumtext,
  `phrasegroup_vbblocksettings` mediumtext,
  `phrasegroup_vb5blog` mediumtext,
  `vblangcode` varchar(12) NOT NULL DEFAULT '',
  `revision` smallint(5) unsigned NOT NULL DEFAULT '0',
  `phrasegroup_ckeditor` mediumtext NOT NULL,
  `phrasegroup_cpcms` mediumtext NOT NULL,
  `phrasegroup_navbarlinks` mediumtext NOT NULL,
  PRIMARY KEY (`languageid`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

これは失敗している[〜#〜] insert [〜#〜]です: https://Gist.githubusercontent.com/ tobsn/a7e573f0df69f483023b/raw/7ae033b921474a2081f5f97a5c348bb08b02d56c/gistfile1.txt

テーブルをInnoDBに設定し、innodb_log_file_sizeしかし、この構成変数はRDSではアクセスできないようです。フィールドをtext、longtext、およびblobに変換しようとしましたが、どれも問題を解決しませんでした。

ありがとうございました!

3
Toby

さて、これを調査して20〜30程度の可能性のある解決策を試した後、私はそれを機能させることができませんでした。したがって、考えられるすべてのソリューションでインポートが失敗します。

私はAuroraインスタンスを終了し、MySQLインスタンスを作成しました。すぐに問題なくインポートされました。インポートまたはログのサイズ制限は、はるかに高いデフォルトに設定されており、データを制限しません。 Amazonは、Auroraではこれまでのところ、Auroraでのこの制限を変更しないと述べたと伝えられています。 MySQLのもう一方の側では、先ほど言ったように、すでにかなり高い制限を設定して、それを編集可能なパラメータにしました。

TLDR:設定したフィールドタイプに関係なく、Auroraは常にフィールドが大きすぎるため、RDS MySQLを使用します。

3
Toby

間違ったデザイン。もう1つのフレーズが必要な場合は、コストのかかる操作である_ALTER TABLE_を使用する必要があります。

代わりに...

  1. PRIMARY KEY(languageid, phrasegroup)を使用して、新しい3列のテーブルPhraseGroupsを作成します。 L * P行が含まれます。L=言語の数、P =フレーズグループの数。 phrasegroupVARCHAR(44)で、「グローバル」、「フォーラム」、「スタイル」、「ユーザー」などを含みます。さらに、languageid(_AUTO_INCREMENT_以外)とMEDIUMTEXT
  2. フレーズグループを新しいテーブルにコピーします。
  3. DROPそのテーブルのすべてのphrasegroup列。これにより、テーブルlanguageに、_thousand_sep_などの言語に関するメタ情報が残ります。

これはよりクリーンなスキーマになり、8126の制限を完全に回避します。

(そして、それはMyISAMまたはInnoDBで機能します。任意のROW_FORMAT)

しかし、LOADの準備ができているファイルがあるので、そこに到達する方法は次のとおりです。具体的には_ENGINE=MyISAM_を使用してテーブルを作成しますが、「raw」のような名前を付けます。次に、私の3つのステップを実行します。ステップ3は、_CREATE TABLE languages... SELECT ... FROM raw;_として実行する方がよい場合があります。

1
Rick James

MyISAMエンジンで「テーブルの作成」を表示しますが、エラーはInnoDBから発生しているため、変更したか、RDSで変更しました。

から manual

「MySQLの古いバージョンで作成されたテーブルは、アンテロープファイル形式を使用します。これは、ROW_FORMAT = REDUNDANTおよびROW_FORMAT = COMPACTのみをサポートします。これらの形式では、MySQLは、BLOB、VARCHAR、およびTEXT列の最初の768バイトをクラスター化インデックスレコードに格納します。主キー768バイトのプレフィックスの後に、残りの列値を含むオーバーフローページへの20バイトのポインターが続きます。

つまり、これらの形式を使用すると、TEXT列のバリアントごとに行サイズが768バイト増加する可能性があります。実際の行のデータが合計で8kの制限を超えると、エラーが発生します。これは、フィールドにそれほど短くないテキストが多数ある場合に発生し、1つの長いテキストはトリガーされません。

ROW_FORMATを、プレフィックスをインラインに保持しないものに変更するか、テーブルを2つ以上に分割して、それぞれに適切な数のblob/text列を含めることができます。

代わりにMyISAMを使用することもできますが、RDSがそれを十分にサポートしているかどうかはわかりません。

1
jkavalik