物語
最近、MySQL サーバーでレプリケーションをセットアップしました。マスター - マスター レプリケーションのルートをたどりました (ここで説明されているように、2 つのサーバー、それぞれがマスターであり、もう一方はスレーブです - http://brendanschwartz.com/post/12702901390/mysql-master-master-replication )。
WAMP で PhpMyAdmin を使用すると、一部のクエリが失敗したり、予期しない動作を表示したりすることに気付き始めました。たとえば、突然:
-- This fails
SELECT * FROM `tableName` WHERE `columnName` = 10;
-- This succeeds
SELECT * FROM tableName WHERE columnName = 10;
-- In some queries, specific columns seem to be the issue
-- So even this might work, but not always
SELECT * FROM `tableName` WHERE columnName = 10;
-- Sometimes it's even due to specific columns
-- So this might succeed
SELECT * FROM `tableName` WHERE `anotherColumnName` = 10;
MySQLシェルを介してそれを行うとうまくいったので、おそらくPhpMyAdminのせいだとすぐに気づきました。その後、Linux ベースの自分のマシンの PhpMyAdmin でも機能し、PhpMyAdmin のバージョンの方がはるかに新しいことに気付きました。
ただし、通常のシェルからいくつかのクエリを実行しようとすると、バッククォートの問題が発生します。たとえば、次のようになります。
# From my bash shell, this fails
mysql -s -uUser -pPassword -e "SELECT `columnName` FROM `dbName`.`tableName`;"
# This succeeds
mysql -s -uUser -pPassword -e "SELECT columnName FROM dbName.tableName;"
私は偶然を信じていないので、何が起こっているのかを確認したほうがよいと思いました。
私がこれまでに持っているもの
オンラインで検索したところ、ログに保存される方法が原因で、バックティックとレプリケーションに問題がある可能性があることがわかりました (私は思います)。しかし、レプリケーションがまだどのように機能しているかはまだ完全にはわかりませんが、一部のクエリはバッククォートで失敗しています。どちらかといえば、私のデータは、バックティックに問題がないことをサポートしています。
バックティックの目的を知っています- https://dba.stackexchange.com/questions/23129/benefits-of-using-backtick-in-mysql-queries
私のMySQLサーバーは実行されています:
- Ubuntu 14.04.01 (64 ビット サーバー版)
- MySQL バージョン 14.14 Distrib 5.5.41、readline 6.3 を使用する debian-linux-gnu (x86_64) 用
私の質問は次のとおりです。
- バックティックがレプリケーションに悪いのはなぜですか? バックティックで問題が発生する可能性はありますか、それとも難解なプラットフォーム固有の問題が原因でしたか?
- この問題に対処するための推奨される方法はありますか?
- 私の考えは、コード内のすべてのバッククォートを取り除くことです。私の列名はすべてプレーンな英語のアルファベットとキャメルケースであるため、バッククォートを使用する
必要はありません。
- に切り替えることができると思いまし
sql_mode = ANSI_QUOTES
たが、値などのクエリの他の側面にどのように影響するかがわからないため、このような大きな変更にはシステム全体の徹底的なテストが必要になるのではないかと心配しています. - また、バッククォートが名前の一部になっている可能性もあると思いましたが、動作に適合していないため、確認しました。
- に切り替えることができると思いまし
この問題に関して、どなたかのご意見をいただければ幸いです。