tag:crieit.net,2005:https://crieit.net/tags/mysql5.7/feed 「mysql5.7」の記事 - Crieit Crieitでタグ「mysql5.7」に投稿された最近の記事 2021-11-20T17:13:30+09:00 https://crieit.net/tags/mysql5.7/feed tag:crieit.net,2005:PublicArticle/17771 2021-11-20T17:13:30+09:00 2021-11-20T17:13:30+09:00 https://crieit.net/posts/mysql-on-docker-error-lower-case-table-names-20211120 Docker から MySQL 用のコンテナで初期化・起動しようとしたら The server option 'lower_case_table_names' is configured ... エラーで失敗する <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p>Docker から自作の MySQL 用のコンテナで初期化・起動しようとしたら MySQL が起動しておらず、手動で初期化コマンドを実行したら以下のエラーで失敗する現象に遭遇しました。</p> <blockquote> <p>[ERROR] The server option 'lower_case_table_names' is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination. Please consider either</p> <p>using a case sensitive file system for your data directory or switching to a case-insensitive table name mode.</p> </blockquote> <h2 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h2> <p>環境としては以下の自作の LAMP環境 作成用の Docker Compose を使用しました。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/docker_compose_ambergrease/tree/afa8c12e3dff1ec435643bcd8c9a3215d1409a25">GitHub - arm-band/docker_compose_ambergrease</a></li> </ul> <p>MySQL5.7系 で、 entrypoint で</p> <ul> <li>設定ファイルをテンプレートからコピーして配置</li> <li><code>/usr/sbin/mysqld --user=mysql --initialize &</code> で初期化コマンド実行</li> <li><code>/usr/sbin/mysqld --user=mysql &</code> で MySQL 起動</li> <li>MySQL のログから初期パスワードを見つけ出し、環境変数で設定された値に管理者パスワードを変更</li> </ul> <p>をしています。</p> <p>このうち、2つ目の <code>/usr/sbin/mysqld --user=mysql --initialize &</code> で上述のエラーが発生していました。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p>エラー文は「 MySQL の設定では大文字小文字を区別する設定になっているが、 <code>data</code>ディレクトリ のファイルシステムは大文字小文字を区別しない環境になっていて不一致を起こしているので、どちらかに統一してね」ということのようです。</p> <p>今回は Docker for Windows 利用で、 <code>data</code>ディレクトリ はホスト側の Windows のフォルダにボリュームをマウントしています。また、データはコンテナを落としても保持していてほしいので Windows とのボリュームマウントを解除する方向性はなし。</p> <p>そのため、ファイルシステムは Windows 依存になるので、大文字小文字を区別するファイルシステムに寄せるのは厳しい。したがって、 MySQL 側の設定を調整することにします。</p> <pre><code class="conf">[mysqld] ## 略 # not only lowercase characters in tablename # lower_case_table_names = 0 lower_case_table_names = 1 </code></pre> <p>該当の設定は <code>lower_case_table_names</code> 。この値<code>0</code>だと大文字小文字を区別する、<code>1</code>だと小文字に変換、<code>2</code>だと大文字小文字を区別してディスクに保存するが MySQL からのルックアップ時に小文字に変換、という挙動になるようです。</p> <p>今回はシンプルに全て小文字変換で<code>1</code>とすることにしました。</p> <p>これで問題が解決されたことを確認。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/131905">MySQL - MySQLが起動しない(mac)|teratail</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/doc/refman/5.6/ja/identifier-case-sensitivity.html">MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.2.2 識別子の大文字と小文字の区別</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16588 2021-01-13T15:54:43+09:00 2021-01-13T15:55:10+09:00 https://crieit.net/posts/MySQL-ALTER-TABLE 【MySQL】ALTER TABLEする際の空き容量の確認方法 <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>Zabbix3.0から4.0へのバージョンアップの際、DB(MySQL)のテーブルを<code>ALTER TABLE</code>する必要があります。<br /> テーブル同程度のディスク空き容量が必要とのことだが、具体的にどうやって算出すれば良いのか分からなかったため、調べました。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <ul> <li><code>ALTER TABLE</code>の際は元のテーブルと同程度のディスク空き容量が必要</li> <li>テーブルのコピーは元テーブルと同じディレクトリに作成されるため、元テーブルの格納ディレクトリがマウントされているディスクの空き容量を確認する</li> </ul> <h1 id="検証環境"><a href="#%E6%A4%9C%E8%A8%BC%E7%92%B0%E5%A2%83">検証環境</a></h1> <ul> <li>MySQL:5.7.32</li> </ul> <h1 id="調べたこと"><a href="#%E8%AA%BF%E3%81%B9%E3%81%9F%E3%81%93%E3%81%A8">調べたこと</a></h1> <p>まず、以下の記事にもある通り、<code>ALTER TABLE</code>コマンドを実行すると、対象テーブルのコピーを作成するため、元テーブルのサイズと同程度のディスク空き容量が必要となる。</p> <p><a target="_blank" rel="nofollow noopener" href="http://nippondanji.blogspot.com/2009/05/alter-table.html">「[ALTER TABLEを上手に使いこなそう。」漢のコンピュータ道,2009-05-11(参照:2021-01-12)]</a></p> <blockquote> <p>ALTER TABLEでは完全なテーブルのコピーを作成する必要があるので、元のテーブルのサイズと同じぐらいのディスク空き容量が必要であることにも注意しなければいけない。</p> </blockquote> <p>また、元テーブルのコピーは、元テーブルと同じディレクトリに作成される。</p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.takanabe.tokyo/2016/04/%E5%B7%A8%E5%A4%A7%E3%81%AA%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8Balter-table%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%AE%E6%A6%82%E7%AE%97%E6%96%B9%E6%B3%95/">「巨大なサイズのテーブルに対するALTER TABLE実行時間の概算方法」PAYFORWARD,2016-04-07(参照:2021-01-12)</a></p> <blockquote> <p>50GBのテーブルを対象としているときは50GB以上の空き領域が必要。ディスク上に一時テーブルの格納場所だが、ほとんどの場合、元のテーブルと同じディレクトリにsql_XXXXというファイル名で生成する。</p> </blockquote> <p>つまり、元テーブルの格納ディレクトリがマウントされているディスクの空き容量を確認する必要がある。</p> <h2 id="テーブルの格納ディレクトリの確認"><a href="#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E6%A0%BC%E7%B4%8D%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E7%A2%BA%E8%AA%8D">テーブルの格納ディレクトリの確認</a></h2> <p>MySQLにログインし、以下コマンドを実行する。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/YumaInaura/items/2b71467456b694760b29">YumaInaura「MySQL | データディレクトリの場所を確認する ( select @@datadir )」Qiita,2017-05-16(参照:2021-01-13)</a></p> <pre><code class="mysql">mysql> select @@datadir; +-----------------+ | @@datadir | +-----------------+ | /var/lib/mysql/ | +-----------------+ 1 row in set (0.00 sec) </code></pre> <h2 id="ディスクの空き容量確認"><a href="#%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%AE%E7%A9%BA%E3%81%8D%E5%AE%B9%E9%87%8F%E7%A2%BA%E8%AA%8D">ディスクの空き容量確認</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://eng-entrance.com/linux-command-df">「dfコマンドについてまとめました【Linuxコマンド集】」エンジニアの入り口,リナックスアカデミー,2016-10-04(参照:2021-01-13)</a></p> <p>以下のコマンドを実施する。</p> <pre><code class="shell"># df -h /var/lib/mysql Filesystem Size Used Avail Use% Mounted on /dev/sda1 5.1G 2.4G 2.5G 49% / </code></pre> <h2 id="テーブルの使用量確認"><a href="#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E4%BD%BF%E7%94%A8%E9%87%8F%E7%A2%BA%E8%AA%8D">テーブルの使用量確認</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ikenji/items/b868877492fee60d85ce">ikenji「MySQLでDBとテーブルのサイズを確認するSQL」Qiita,2019-12-13(参照:2021-01-13)</a></p> <p>MySQLにログインし、以下のコマンドを実行する。</p> <pre><code class="mysql">> SELECT table_name, engine, table_rows AS tbl_rows, avg_row_length AS rlen, (data_length+index_length)/1024/1024 AS all_mb, (data_length)/1024/1024 AS data_mb, (index_length)/1024/1024 AS index_mb FROM information_schema.tables WHERE table_schema='{$DATABASE}' ORDER BY (data_length+index_length) DESC; +----------------------------+--------+----------+-------+-------------+------------+------------+ | table_name | engine | tbl_rows | rlen | all_mb | data_mb | index_mb | +----------------------------+--------+----------+-------+-------------+------------+------------+ | history_uint | InnoDB | 48725 | 107 | 10.03125000 | 5.01562500 | 5.01562500 | (省略) | housekeeper | InnoDB | 0 | 0 | 0.01562500 | 0.01562500 | 0.00000000 | +----------------------------+--------+----------+-------+-------------+------------+------------+ 113 rows in set (0.03 sec) </code></pre> <h2 id="ディスク空き容量は足りるか?"><a href="#%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E7%A9%BA%E3%81%8D%E5%AE%B9%E9%87%8F%E3%81%AF%E8%B6%B3%E3%82%8A%E3%82%8B%E3%81%8B%EF%BC%9F">ディスク空き容量は足りるか?</a></h2> <p>例えば、<code>history_uint</code>を<code>ALTER TABLE</code>すると考える。</p> <ul> <li>ディスク空き容量 : 2.5GB</li> <li>テーブル使用量 : 10.03125000MB=0.009796142578GB≒0.001GB</li> </ul> <p>余裕で足りそうです。<br /> 実際、Zabbix 3.0からZabbix 4.0にアップデートする場合は、<code>ALTER TABLE</code>が必要なテーブル分、計算する必要があります。</p> <h1 id="参考資料"><a href="#%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99">参考資料</a></h1> <p><a target="_blank" rel="nofollow noopener" href="http://nippondanji.blogspot.com/2009/05/alter-table.html">「[ALTER TABLEを上手に使いこなそう。」漢のコンピュータ道,2009-05-11(参照:2021-01-12)]</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.takanabe.tokyo/2016/04/%E5%B7%A8%E5%A4%A7%E3%81%AA%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8Balter-table%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%AE%E6%A6%82%E7%AE%97%E6%96%B9%E6%B3%95/">「巨大なサイズのテーブルに対するALTER TABLE実行時間の概算方法」PAYFORWARD,2016-04-07(参照:2021-01-12)</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/YumaInaura/items/2b71467456b694760b29">YumaInaura「MySQL | データディレクトリの場所を確認する ( select @@datadir )」Qiita,2017-05-16(参照:2021-01-13)</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://eng-entrance.com/linux-command-df">「dfコマンドについてまとめました【Linuxコマンド集】」エンジニアの入り口,リナックスアカデミー,2016-10-04(参照:2021-01-13)</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ikenji/items/b868877492fee60d85ce">ikenji「MySQLでDBとテーブルのサイズを確認するSQL」Qiita,2019-12-13(参照:2021-01-13)</a></p> batica@初心者はここからわかりません。