開発サーバーで作業していて、一部のリリースのデータベース構造を更新している場合、運用サーバーの構造を更新するための最良の方法は何ですか?
現在、構造のみを含む新しい本番データベースを作成し、「古い」本番データベースでデータのSQLダンプを実行してから、SQLクエリを実行してデータを新しいデータベースに挿入します。
これらの更新を行う簡単な方法があることを私は知っていますよね?
前もって感謝します。
開発サーバーで作業していて、一部のリリースのデータベース構造を更新している場合、運用サーバーの構造を更新するための最良の方法は何ですか?
現在、構造のみを含む新しい本番データベースを作成し、「古い」本番データベースでデータのSQLダンプを実行してから、SQLクエリを実行してデータを新しいデータベースに挿入します。
これらの更新を行う簡単な方法があることを私は知っていますよね?
前もって感謝します。
スクリプトなしで製品を実行することはなく、そのスクリプトはソース管理にある必要があります。さらに、最初のスクリプトがうまくいかず、元に戻さなければならない場合に備えて、ロールバック スクリプトを作成する必要があります。そして、本番環境に移行すると、構成管理は本番環境と開発環境の間で差分比較を行い、本番環境のスクリプトで何か見落としがないかどうかを確認します (差分は、まだ本番環境に移行して文書化する準備が整っていない開発段階まで追跡可能である必要があります)。Red-gate の SQL 比較のような製品はこれを行うことができます。私たちのプロセスは非常に形式化されているため、大規模なクライアントが必要とする認証を維持できます。
大きなテーブルがある場合でも、テーブルを変更するのは遅くなる可能性がありますが、新しい名前と構造でテーブルのコピーを作成し、データをそのテーブルにコピーし、古いテーブルの名前を変更してから、新しいテーブルは元のテーブルの名前で、古いテーブルを削除します。
ただし、この場合、ユーザーに明らかなダウンタイムの合計は 2 つのテーブルの名前を変更するのにかかる時間であるため、これが望ましいプロセスである場合があります。アプリケーション (アプリケーションがテーブルを更新できる場合、テーブルの移行中に行われた変更が失われる可能性があるため、これを行うのは危険な行為です)。使用するプロセスの多くは、行っている変更の性質によって異なります。一部の変更は、ユーザーがデータベースへのアクセスを許可されていないメンテナンス ウィンドウで行う必要があります。たとえば、デフォルト値を持つ新しいフィールドを 100,000,000 レコードのテーブルに追加する場合、更新中にユーザーがテーブルを使用できなくなる可能性があります。これは、営業時間外にシングル ユーザー モードで実行することをお勧めします (データベースが使用できないことを事前にユーザーに通知している場合)。その他の変更は数ミリ秒しかかからず、ユーザーがログインしている間に簡単に変更できます。
スキーマを変更するには、alter table を参照してください
あなたの方法よりも簡単ではないかもしれませんが、データベースのコピーが少なくなることを意味します
これは実際にはかなり深い質問です。いくつかの列を追加するだけの変更を行った場合は、おそらく ALTER TABLE で十分です。ただし、列の名前を変更したり削除したりする場合、ALTER ステートメントはさまざまな外部キー制約を破る可能性があります。さらに、データベースとデータの両方に変更を加える必要がある場合もありますが、これはほとんどスクリプト化できません。
これを自動化する最善の方法は、展開ごとに簡単なスクリプトを作成することです (ロールバックするスクリプトも一緒に!)。一部のスクリプトは単純な ALTER ステートメントである場合もあれば、外部キーのチェックやトリガーなどを一時的に無効にする場合もあれば、いくつかの更新ステートメントを実行する場合もあります。また、データベースをダンプして再構築している人もいます。ここに万能の解決策があるとは思いません、ごめんなさい:)
ALTER TABLE コマンドを使用します: http://dev.mysql.com/doc/refman/5.0/en/alter-table.html