MySQLデータベースへの変更を追跡する方法はありますか?私はオフラインで開発し、私のサーバーにすべての変更をコミットします。アプリケーション自体のために、私はGitを使い、うまく動作します。MySQLデータベースを遡及的に変更する
しかし、データベースでは、ライブデータベースに顧客データが含まれていて、開発データベースで置き換えることができないため、すべてを手動で変更しています。
1つのデータベースを別のデータベースに完全に置き換えることなく構造変更を適用する方法はありますか?
MySQLデータベースへの変更を追跡する方法はありますか?私はオフラインで開発し、私のサーバーにすべての変更をコミットします。アプリケーション自体のために、私はGitを使い、うまく動作します。MySQLデータベースを遡及的に変更する
しかし、データベースでは、ライブデータベースに顧客データが含まれていて、開発データベースで置き換えることができないため、すべてを手動で変更しています。
1つのデータベースを別のデータベースに完全に置き換えることなく構造変更を適用する方法はありますか?
あなたが探している用語は「データベース移行」です(いいえ、1つのRDBMSから別のRDBMSへの移行を参照していません)。移行は、データベース構造をプログラム的にバージョン管理する方法です。ほとんどの言語には、しばしばORMライブラリ/フレームワークの一部として移行ツールキットがあります。
PHPの場合は、あなたの変更を追跡するために持っているRuby用Doctrine
それはもちろん
キーのRailsだ時に見ることができますことは、私の友人Snapshotsです。
今、それは広い分野です。まず、何らかのデータを使ってデータベースを追跡するかどうかを決めることです。その場合は、LVM、copying InnoDB binary logs、および簡略mysqldumpを使用するなど、いくつかのオプションがあります。
あなたがしたいことは、データベースの変更(つまり、列を追加したことなど)間に滑らかな移行がある場合は、いくつかのオプションがあります。
最初のレプリケーションはレプリケーションです。それは素晴らしい選択ですが、少し複雑です。レプリケーションでは、1つのスレーブを変更することができます。スレーブを終了した後、ロックしてマスターにしたり、マスターを置き換えたりすることができます。本当に難しいですが、より良い選択肢です。
複製できない場合は、最低限の停止時間でシングルマスターDBに変更を適用する必要があります。良い選択肢は次のとおりです。
"facebook_account"フィールドを追加するためにCustomerテーブルを置き換えたいとします。まず、あなたはこのように、エイリアステーブルを使用することができます。
(それはデータを持っている)元のテーブル:
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
新しい1:
CREATE TABLE `new_customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`facebook_account` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
それとも単に:
CREATE TABLE new_customer LIKE customer;
ALTER TABLE new_customer add column facebook_account VARCHAR(255);
これでデータを新しいテーブルにコピーします。最初に他のものを発行する必要があります。私はそれらをそれぞれ一度に説明します。
まず、テーブルを変更している間に他の接続で顧客テーブルを変更できるようにすると、ロックが発行されます。あなたはこれについての詳細を知りたい場合は、hereを行く:
LOCK TABLES customer WRITE ,new_customer WRITE;
を今私は、ファイルシステムへのキャッシュの内容を書き込むためのテーブルをフラッシュ:
FLUSH TABLES customer;
今、私たちは、挿入を行うことができます。まず、パフォーマンス上の問題のキーを無効にします。データが挿入された後、私は再びキーを有効にします。
ALTER TABLE new_customer DISABLE KEYS;
INSERT INTO new_customer(id,name,facebook_account) SELECT customer.id,customer.name, Null FROM customer;
ALTER TABLE new_customer ENABLE KEYS;
ここでテーブルを切り替えることができます。
ALTER TABLE customer RENAME old_customer;
ALTER TABLE new_customer RENAME customer;
最後に、ロックを解除する必要があります。
UNLOCK TABLES;
これだけです。変更したテーブルを追跡したい場合は、old_customerテーブルの名前を別のテーブルに変更するか、別のデータベースに移動することができます。
私がここでカバーしていない唯一の問題は、トリガーについてです。有効になっているすべてのトリガーに注意を払う必要がありますが、スキーマによって異なります。
これで解決できます。
私はそれについて聞いてみたいと思えば、これまでの方法では、変更スクリプトをソース管理にコミットするしかありませんでした。データベースをロールバック/転送すると、フィールドの変更によるデータの損失/破損の問題が発生する可能性があるという問題があります。私はこれをMySQLに満足させるためのシステムをまだ見つけていませんが、どこかに存在する必要があると考えるのを助けることはできません。 –