プロジェクト

全般

プロフィール

QA #1085

奈良 裕記 さんが約4年前に更新

h3. ■現象/要望 

 Redmine稼働環境のDBMSとして、mysql/mariadb, postgresqlの2系統が主に利用されている。 
 DBMS間差異は殆どがRails側で吸収されているが、DBMS自体の動作差異により、完全に同一の動作とはなっていない。postgresqlでは問題無く、MYSQL環境でのみトラブル発生する場合もある。 

 *DBMS差異による動作差異の発生個所、対処方法をまとめ、各現場で円滑に運用可能にしたい。* 

 本チケットの対象範囲 

 ・本チケットに対象範囲は mysql/mariadb, postgresqlの2系統とし、SQLite、MSSQLServerを除外する。 
 (理由は補足欄参照、関連情報のリンクは構いませんが、積極的な調査対象とはしない。) 

 h3. ■解決策 

 DBMS間差異に関連すると思われる事例/対応策を記録。 
 (情報リンク/抜粋で良い) 



 


 h1. 対応作業事例 

 h2. DBMS/Railsバージョンにより、Migration中で処理分割する場合 

 h3. 対処方法 

 DBMS/Railsバージョンにより、Migration中で処理分割する場合 
 if Redmine::Database.mysql? 
   if Redmine::Database.postgresql? 
     if Rails::VERSION::MAJOR == 4 

 詳細は下記参照 
 DB Migrationの実行を条件分けしたい(migration失敗回避) 
 https://redmine.tokyo/issues/844 

 h2. PluginのDB migration中エラー(Mysql:外部キー存在時、インデックス削除失敗) 

 h3. 現象/発生条件 

 redmine_knowledgebase Redmine4.0対応(と思われるフォーク)にて、DB migration中に下記エラー発生する。 

 Cannot drop index 'index_taggings_on_tag_id': needed in a foreign key constraint: DROP INDEX `index_taggings_on_tag_id` ON `taggings` 

 現象発生フォーク 
 https://github.com/southbridgeio/redmine_knowledgebase 

 関連やりとり 
 https://twitter.com/y503Unavailable/status/1235222914850361345 

 h3. 発生原因 

 Mysqlで外部キーを作成すると、インデックスが自動的に追加される。(pgsqlでは追加されないと思われる) 
 Migration中でインデックスを削除しようとしても、外部キーが存在すると、インデックスの削除に失敗する。 

 http://kwski.net/mysql/602/ 
 >MySQLでは外部キーを設定すると自動的にインデックスが作成されるようです。 
 >逆に外部キーが設定されたままインデックスを削除しようとするとエラーになります。 

 h3. 対処方法 

 (暫定対策) 
 DB Migration失敗後(問題となったテーブルの外部キー作成後)、手動で外部キーを削除してから再度実行する。 
 Migration完了後に再度外部キーを作成する。 
 これで一応通った。 

 本来は、Rails側流儀に合った形で恒久対応必要 

 h4. migration中での処理方法 

 Railsマイグレーションのindex、foreign_keyの設定 
 https://qiita.com/shitake4/items/2f08c0d9b13d090c6071 
 インデックス、外部キーの追加/削除 
 add_index、remove_index、add_foreign_key、remove_foreign_key  

 Railsの外部キー制約とreference型について 
 https://qiita.com/ryouzi/items/2682e7e8a86fd2b1ae47 

 Railsで外部キー制約のついたカラムを作る時のmigrationの書き方 
 https://qiita.com/publichtml/items/1fba15d8071fab66d043 
 add_reference  

 h2. (テンプレ)現象タイトル 

 h3. 現象/発生条件 

 h3. 発生原因 

 h3. 対処方法 

 h1. ■補足情報 

 h3. SQLite/MSSQLServerを除外する背景 

 ・SQLiteはローカルの検証環境で利用される場合があるが、中規模以上の実運用環境では性能上無理がある。 
 ・Redmine構築用パッケージ(ansible)/配布VM/コンテナでは、mysql/mariadb, postgresqlの利用が大半である。 
 ・MSSQLServerは、2020/3現在、Redmine4.0で動作していない(Redmine本家30285) 
  利用も少ないと思われる。(Windows環境ではBitnami利用が大半) 

 !https://unofficial-redmine.org/matomo/matomo.php?idsite=1&rec=1085! 

戻る