Bug(バグ) #1972
closedテーブル単位でデータベース接続先を設定しても無視される
100%
Description
現象¶
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レプリケーション処理のために、テーブルに紐付いているコネクションを無視して上書きしてしまうため。
修正内容¶
修正内容を記入
Files
Updated by Youichi Kimura over 13 years ago
- Status changed from New(新規) to Accepted(着手)
- Assignee set to Youichi Kimura
Updated by Youichi Kimura over 13 years ago
- Status changed from Accepted(着手) to New(新規)
- Assignee deleted (
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());
}
}
Updated by Youichi Kimura over 13 years ago
明示的にクエリにコネクションが設定されている場合は $this->_passedConn がtrueになるようなので、これを利用してnote-2の判定が行えそうです。
Updated by Youichi Kimura over 13 years ago
- Status changed from New(新規) to Pending Review(レビュー待ち)
- % Done changed from 0 to 50
更新履歴 5868a96b6847555917496015b67b4ef72fc47646 で適用されました。
Updated by Kousuke Ebihara about 13 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- Target version set to OpenPNE 3.7.0
- % Done changed from 50 to 70
Updated by Yuma Sakata over 12 years ago
- File レプリケーションの設定.rd レプリケーションの設定.rd added
- 3.6 で発生するか set to Unknown (未調査)
- 3.4 で発生するか set to 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
?
Updated by Shouta Kashiwagi over 12 years ago
- Status changed from Pending Testing(テスト待ち) to Fixed(完了)
- % Done changed from 70 to 100
テストOKです。