プロジェクト

全般

プロフィール

Bug(バグ) #1972

テーブル単位でデータベース接続先を設定しても無視される

Youichi Kimura約13年前に追加. 6年以上前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
期日:
進捗率:

100%

3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

説明

現象

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レプリケーション処理のために、テーブルに紐付いているコネクションを無視して上書きしてしまうため。

修正内容

修正内容を記入

レプリケーションの設定.rd (2.68 KB) Yuma Sakata, 2012-03-21 16:38


子チケット

Backport(バックポート) #4233: テーブル単位でデータベース接続先を設定しても無視されるNew(新規)


関連するチケット

関連している OpenPNE 3 - Enhancement(機能追加・改善) #635: 画像テーブルを別DBにできるようにする New(新規) 2010-02-15

関係しているリビジョン

リビジョン 5868a96b (差分)
Youichi Kimuraほぼ13年前に追加

keep the specified connection on a query and a table for databases (fixes #1972)

履歴

#1 Youichi Kimura約13年前に更新

  • ステータスNew(新規) から Accepted(着手) に変更
  • 担当者Youichi Kimura にセット

#2 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());
     }
   }

#3 Youichi Kimuraほぼ13年前に更新

明示的にクエリにコネクションが設定されている場合は $this->_passedConn がtrueになるようなので、これを利用してnote-2の判定が行えそうです。

#4 Youichi Kimuraほぼ13年前に更新

  • ステータスNew(新規) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 5868a96b6847555917496015b67b4ef72fc47646 で適用されました。

#5 Youichi Kimuraほぼ13年前に更新

  • 担当者Youichi Kimura にセット

#6 Kousuke Ebihara12年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 対象バージョンOpenPNE 3.7.0 にセット
  • 進捗率50 から 70 に変更

#7 Yuma Sakata約12年前に更新

  • ファイル レプリケーションの設定.rd を追加
  • 3.6 で発生するかUnknown (未調査) にセット
  • 3.4 で発生するかUnknown (未調査) にセット

MySQLでレプリケーションのやり方手順です。

= MySQLレプリケーションの設定
すでに構築されているマスターDBを元に、別サーバ内レプリケーションを構築するための手順。

マスター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

  1. /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 :~/

=== 転送したデータを スレーブに配置する

@slave # /etc/init.d/mysqld stop # rm -rf /var/lib/mysql

  1. cp -rp /home/admin/mysql /var/lib/mysql
  2. chown -R mysql:mysql /var/lib/mysql

=== マスタDBの再開
@master # /etc/init.d/mysqld start

スレーブDBの設定
= スレーブ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
?

#8 Shouta Kashiwagi約12年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

#9 Chiharu Nakajima6年以上前に更新

3.6未対応
3.8対応済み

他の形式にエクスポート: Atom PDF