MySQL で 2 つのデータベース テーブル構造を比較する方法

MySQL で 2 つのデータベース テーブル構造を比較する方法

開発およびデバッグのプロセスでは、新しいコードと古いコードの違いを比較する必要があります。比較には、git/svn などのバージョン管理ツールを使用できます。また、異なるバージョンのデータベース テーブル構造にも違いがあります。その違いを比較し、構造を更新するための SQL ステートメントを取得する必要もあります。

たとえば、同じコードセットが開発環境では正常に動作するが、テスト環境では問題が発生する場合があります。この場合、サーバーの設定を確認するだけでなく、開発環境とテスト環境のデータベース テーブル構造に違いがあるかどうかも比較する必要があります。違いを見つけたら、開発環境とテスト環境のデータベース テーブル構造が一致するまで、テスト環境のデータベース テーブル構造を更新する必要があります。

mysqldiff ツールを使用して、データベース テーブル構造を比較し、構造を更新するための SQL ステートメントを取得できます。

1.mysqldiffのインストール方法

mysqldiffツールはmysql-utilitiesパッケージに含まれており、mysql-utilitiesを実行するには依存関係mysql-connector-pythonをインストールする必要があります。

mysql-connector-python のインストール

ダウンロードアドレス: https://dev.mysql.com/downloads/connector/python/

mysql-utilities のインストール

ダウンロードアドレス: https://downloads.mysql.com/archives/utilities/

私は Mac システムを使用しているので、brew を直接使用してインストールできます。

brew をインストール caskroom/cask/mysql-connector-python
brew をインストール caskroom/cask/mysql-utilities

インストール後、バージョンを表示するコマンドを実行します。バージョンが表示されれば、インストールは成功しています。

mysqldiff --バージョン
MySQL ユーティリティ mysqldiff バージョン 1.6.5 
ライセンスタイプ: GPLv2

2. mysqldiffの使い方

注文:

mysqldiff --server1=root@host1 --server2=root@host2 --difftype=sql db1.table1:dbx.table3

パラメータの説明:

--server1 はデータベース 1 を指定します
--server2 はデータベース2を指定します

比較は単一のデータベースで実行できます。server1 オプションのみを指定すると、同じデータベース内の異なるテーブル構造を比較できます。

--difftype 差分情報を表示する

統合(デフォルト)
統一形式の出力を表示する

コンテクスト
コンテキスト形式の出力を表示する

異なる
さまざまな形式で出力を表示する

SQL文
SQL変換文の出力を表示する

SQL 変換文を取得したい場合は、SQL 表示モードが最適です。

--character-set は文字セットを指定します

--changes-for は、変換するオブジェクト、つまり差分を生成する方向を指定するために使用されます。デフォルトは server1 です。

--changes-for=server1 は、server1 が server2 に変換され、server2 がプライマリ サーバーになることを意味します。

--changes-for=server2 は、server2 が server1 の構造に変換され、server1 がプライマリになることを意味します。

--skip-table-options AUTO_INCREMENT、ENGINE、CHARSET の違いを無視します。

--version バージョンを表示

mysqldiff パラメータの使用方法の詳細については、公式ドキュメントを参照してください。
参考文献

3. 例

テストデータベーステーブルとデータを作成する

データベース testa を作成します。
データベース testb を作成します。

種皮を使用する。

テーブル `tba` を作成します (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 `name` varchar(25) NOT NULL,
 `age` int(10) 符号なし NOT NULL,
 `addtime` int(10) 符号なし NOT NULL,
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 デフォルトCHARSET=utf8;

`tba`(name,age,addtime) に値 ('fdipzone'、18、1514089188) を挿入します。

testb を使用します。

テーブル `tbb` を作成します (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 `age` int(10) NOT NULL,
 `addtime` int(10) NOT NULL,
 主キー (`id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

`tbb`(name,age,addtime) に値 ('fdipzone'、19、1514089188) を挿入します。

差分比較を実行し、server1 をメイン サーバーとして設定し、server2 を server1 のデータベース テーブル構造に変換する必要があります。

mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --difftype=sql testa.tba:testb.tbb;
# ローカルホスト上の server1: ... 接続されました。
# ローカルホスト上の server2: ... 接続されました。
# testa.tba と testb.tbb を比較しています [失敗]
# --changes-for=server2 の変換:
#

テーブル `testb`.`tbb` を変更します 
 列の変更 addtime addtime int(10) unsigned NOT NULL, 
 列の変更 age age int(10) unsigned NOT NULL, 
 列名の変更 name varchar(25) NOT NULL, 
名前を testa.tba に変更 
、AUTO_INCREMENT=1002;

# 比較に失敗しました。1 つ以上の相違点が見つかりました。

mysqldiffによって返された更新SQL文を実行する

mysql> テーブル `testb`.`tbb` を変更します 
  -> 列の変更 addtime addtime int(10) unsigned NOT NULL, 
  -> 列の変更 age age int(10) unsigned NOT NULL, 
  -> 列名を変更します。name varchar(25) NOT NULL;
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

比較するために、mysqldiff を再度実行します。構造に違いはなく、AUTO_INCREMENT のみが異なります。

mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --difftype=sql testa.tba:testb.tbb;
# ローカルホスト上の server1: ... 接続されました。
# ローカルホスト上の server2: ... 接続されました。
# testa.tba と testb.tbb を比較しています [失敗]
# --changes-for=server2 の変換:
#

テーブル `testb`.`tbb` を変更します 
名前を testa.tba に変更 
、AUTO_INCREMENT=1002;

# 比較に失敗しました。1 つ以上の相違点が見つかりました。

AUTO_INCREMENT を無視するように設定し、差異を比較します。比較は成功します。

mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --skip-table-options --difftype=sql testa.tba:testb.tbb;
# ローカルホスト上の server1: ... 接続されました。
# ローカルホスト上の server2: ... 接続されました。
# testa.tba と testb.tbb を比較しています [PASS]
# 成功。すべてのオブジェクトは同じです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • SQL 複数テーブル複数フィールド比較メソッドのサンプルコード

<<:  JavaScript は大容量ファイルのアップロード処理を実装します

>>:  Nginx インストールの詳細なチュートリアル

推薦する

Windows Server2014 にセキュリティを適用して MySQL をインストールする際のエラーに対する完璧な解決策

理由はインストール後にきちんとアンインストールされなかったためです。この問題を解決するには、次の点に...

VMware vCenter 6.7 のインストール プロセス (グラフィック チュートリアル)

背景当初は VMware の公式 Web サイトから 6.7 Vcenter をダウンロードしたかっ...

Vueインスタンスで$refsを使用する際の注意点

開発の過程では、インスタンスの vm.$refs(this.$refs) を使用して、ref で登録...

MYSQL開発パフォーマンス調査:バッチデータ挿入の最適化方法

1. どのような問題に直面しましたか?標準 SQL では、通常、次の SQL 挿入ステートメントを記...

Linux での SSH パスワードフリーログイン設定の詳細な説明

Linux サーバー A と B が 2 台あり、一方のサーバーから SSH 経由でパスワードなしで...

CentOS7 ファイアウォールとポート関連コマンドの紹介

目次1. ファイアウォールの現在の状態を確認する2. ファイアウォールサービスを開始する3. ファイ...

CSS3のbox-shadowプロパティの使い方の詳細な例

CSS には多くの属性があります。特に複数の値を設定する必要がある属性は、長期間使用しないと忘れられ...

Windows システムで MySQL が起動しない場合の一般的な解決策

MySQL 起動エラーWindows 10 に MySQL をインストールする前は、net star...

イメージの起動時にdocker runまたはdocker restartが自動的に終了する問題を解決します

コマンドを実行します: docker run --name centos8 -d centos /b...

CSS でレスポンシブ レイアウトを実装する方法

CSS でレスポンシブ レイアウトを実装するレスポンシブレイアウトは非常にハイエンドで難しいように思...

HTMLページのネイティブVIDEOタグはダウンロードボタン機能を隠します

Web プロジェクトを作成しているときに、紹介ビデオが別にある紹介ページに遭遇しました。この短いビデ...

光沢のある輝くウェブサイトデザインの感動的なデザイン例

このコレクションには、あなたのデザインアイデアにインスピレーションを与える、輝いて光沢のある、優れた...

Ubuntu Linux に Git と GitHub をインストールして使用する

Git 入門Git は、Linux(R) カーネル開発の管理を支援するために 2005 年に Lin...

個人ブログシステムを構築するためのDockerの超シンプルな実装

Dockerをインストールするyumパッケージを最新バージョンに更新します: sudo yum up...