Project

General

Profile

Bug(バグ) #1972

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

Added by Youichi Kimura over 12 years ago. Updated about 6 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Target version:
Start date:
Due date:
% Done:

100%

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

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

修正内容

修正内容を記入

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


Subtasks

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


Related issues

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

Associated revisions

Revision 5868a96b (diff)
Added by Youichi Kimura over 12 years ago

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

History

#1 Updated by Youichi Kimura over 12 years ago

  • Status changed from New(新規) to Accepted(着手)
  • Assignee set to Youichi Kimura

#2 Updated by Youichi Kimura over 12 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());
     }
   }

#3 Updated by Youichi Kimura over 12 years ago

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

#4 Updated by Youichi Kimura over 12 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

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

#5 Updated by Youichi Kimura over 12 years ago

  • Assignee set to Youichi Kimura

#6 Updated by Kousuke Ebihara about 12 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • Target version set to OpenPNE 3.7.0
  • % Done changed from 50 to 70

#7 Updated by Yuma Sakata over 11 years ago

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 Updated by Shouta Kashiwagi over 11 years ago

  • Status changed from Pending Testing(テスト待ち) to Fixed(完了)
  • % Done changed from 70 to 100

テストOKです。

#9 Updated by Chiharu Nakajima about 6 years ago

3.6未対応
3.8対応済み

Also available in: Atom PDF