Bug(バグ) #1972
完了テーブル単位でデータベース接続先を設定しても無視される
100%
説明
現象¶
config/ProjectConfiguration.class.php 内で、
$manager->openConnection('sqlite:/var/local/dbfiles/openpne3-uploads.sqlite', 'slave-uploads');
$manager->bindComponent('File', 'slave-uploads');
$manager->bindComponent('FileBin', 'slave-uploads');
のような設定を追加しても、指定したとおりに接続先が変更されない。
原因¶
opDoctrineQuery や opDoctrineRecord がDBレプリケーション処理のために、テーブルに紐付いているコネクションを無視して上書きしてしまうため。
修正内容¶
修正内容を記入
ファイル
Youichi Kimura さんが13年以上前に更新
- ステータス を New(新規) から Accepted(着手) に変更
- 担当者 を Youichi Kimura にセット
Youichi Kimura さんが13年以上前に更新
- ステータス を Accepted(着手) から New(新規) に変更
- 担当者 を削除 (
Youichi Kimura)
lib/util/opDoctrineRecord.class.php の問題の箇所は修正できましたが、lib/util/opDoctrineQuery.class.php の修正で行き詰まったため一旦手放します。
lib/util/opDoctrineRecord.class.php の修正箇所:
--- a/lib/util/opDoctrineRecord.class.php
+++ b/lib/util/opDoctrineRecord.class.php
@@ -52,7 +52,10 @@ abstract class opDoctrineRecord extends sfDoctrineRecord implements Zend_Acl_Res
public function save(Doctrine_Connection $conn = null)
{
- if (is_null($conn))
+ $hasConnection = Doctrine_Manager::getInstance()
+ ->hasConnectionForComponent($this->getTable()->getComponentName());
+
+ if (is_null($conn) && !$hasConnection)
{
$conn = opDoctrineQuery::chooseConnection(true);
}
lib/util/opDoctrineQuery.class.php のコネクションが上書きされる箇所:
public function preQuery()
{
if ($this->specifiedConnection)
{
$this->_conn = $this->specifiedConnection;
}
else
{
$this->_conn = self::chooseConnection($this->shouldGoToMaster, $this->getType());
}
}
Youichi Kimura さんが13年以上前に更新
明示的にクエリにコネクションが設定されている場合は $this->_passedConn がtrueになるようなので、これを利用してnote-2の判定が行えそうです。
Youichi Kimura さんが13年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 5868a96b6847555917496015b67b4ef72fc47646 で適用されました。
Kousuke Ebihara さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 対象バージョン を OpenPNE 3.7.0 にセット
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが12年以上前に更新
- ファイル レプリケーションの設定.rd レプリケーションの設定.rd を追加
- 3.6 で発生するか を Unknown (未調査) にセット
- 3.4 で発生するか を Unknown (未調査) にセット
MySQLでレプリケーションのやり方手順です。
= MySQLレプリケーションの設定
すでに構築されているマスターDBを元に、別サーバ内レプリケーションを構築するための手順。
= レプリケーション用ユーザの作成
master
// ユーザ名(t_repl), ホスト(slave.pne.jp)、パスワード は適宜変更
$ mysql -u root -p
> GRANT SELECT, RELOAD, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 't_repl'
'slave.pne.jp' IDENTIFIED BY 'password';
=== バイナリログ設定の追加
レプリケーション用のバイナリログを出力するように設定する。
@master
# vi /etc/my.cnf
[mysqld]
server-id=1
log-bin
- /etc/init.d/mysqld restart
=== マスタDB動作確認
@master
// マスタDBのレプリケーションが開始されたのを確認する
// スレーブDBのレプリケーション設定で使うので、File, Position の値を控えておく
# mysql -u root -p
> show master status \G
******************* 1. row *******************
File: mysqld-bin.0000001
Position: 106
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
= マスタDBのデータをスレーブDBに転送
マスタDBを一旦停止して、スレーブDBに現在のデータ内容を転送する。
@master # /etc/init.d/mysqld stop # scp -rp /var/lib/mysql admin@slave.pne.jp:~/
=== 転送したデータを スレーブに配置する
@slave # /etc/init.d/mysqld stop # rm -rf /var/lib/mysql
- cp -rp /home/admin/mysql /var/lib/mysql
- chown -R mysql:mysql /var/lib/mysql
=== マスタDBの再開
@master
# /etc/init.d/mysqld start
= スレーブDBの # vi /etc/my.cnf
[mysqld]
server-id = 2 # マスターの server-id と被らないようにする
#log-bin # バイナリログの保存はしない # /etc/init.d/mysqld start
=== レプリケーションの設定
$ mysql -u root -p
// レプリケーションの停止
> slave stop;
// レプリケーションの設定
> CHANGE MASTER TO
MASTER_HOST='master.pne.jp', # マスターDBのホスト名orIP
MASTER_PORT=3306,
MASTER_USER='t_repl',
MASTER_PASSWORD='XXXXXX',
MASTER_LOG_FILE='mysqld-bin.0000001', # 「マスタDB動作確認」で確認した File
MASTER_LOG_POS=106; # 「マスタDB動作確認」で確認した Position
// スレーブDBの開始
> slave start ;
// 動作状況の確認
// Slave_IO_Running, Slave_SQl_Running が YES か確認
//
> show slave status \G
?
Slave_IO_Runnning : yes
Slave_SQL_Runnning: yes
?
Shouta Kashiwagi さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。