MySQLデータ移行方法とツールの分析

MySQLデータ移行方法とツールの分析

この記事は主にMySQLデータ移行方法とツールの分析を紹介します。サンプルコードを通じて詳細に紹介されており、皆さんの勉強や仕事に一定の参考値があります。困っている友人は参考にしてください。

データ移行は、すべてのバックエンドが遭遇するタスクの1つです。この記事では、一般的なデータ移行方法とツールを紹介します。

mysqldump: データ構造を変更せずにデータを移行する

データのエクスポート

mysqldump -u root -p DATABASE_NAME テーブル名 > dump.sql

データの回復

mysql -u root -p DATABESE_NAME < dump.sql

またはmysqlクライアントに接続する

mysql> ソース dump.sql

pymysqlを使用してデータベースに接続する

ユーザー名とパスワードで直接接続できるデータベース

クラス GeneralConnector:
  def __init__(self, config, return_dic=False):
    自己.return_dic = return_dic
    self.config = 設定

  def __enter__(self):
    self.conn = pymysql.connect(**self.config、ポート=3306)
    self.return_dicの場合:
      # データの行は辞書になります self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
    それ以外:
      自己カーソル = 自己connカーソル()
    自己カーソルを返す

  def __exit__(self, *args):
    自己カーソルを閉じる()
    自己コミット()
    自己接続を閉じる()

使用:

# ローカルデータベース = {
# 'ユーザー': 'root',
# 'passwd': ''、
# 'ホスト': '127.0.0.1',
# 'db': 'local_db'
# }
GeneralConnector(const.local_db, return_dic=True) をカーソルとして使用します。
  カーソル.execute('SELECT `col1`, `col2` FROM test;')
  カーソル.fetchall() を返す

SSH接続を必要とするサーバー上のデータベースに接続する

クラス SSHConnector:
  def __init__(self, server, config, return_dic=False):
    自己.return_dic=リターンディック
    self.server = サーバー
    self.config = 設定

  def __enter__(self):
    self.conn = pymysql.connect(**self.config、ポート=self.server.local_bind_port)
    self.return_dicの場合:
      # データの行は辞書になります self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
    それ以外:
      自己カーソル = 自己connカーソル()
    自己カーソルを返す

  def __exit__(self, *args):
    自己カーソルを閉じる()
    自己コミット()
    自己接続を閉じる()

使用:

#SERVER = SSHTunnelForwarder(
# (リモートホスト、sshポート)、
# ssh_username=ユーザー名,
# ssh_pkey=SSH_KEY、
# ssh_private_key_password=SSH_KEY_PASSWD,
# remote_bind_address=('127.0.0.1', 3306) # mysql サービスの場所# )
# server_db = {
# 'ユーザー': 'root',
# 'passwd': ''、
# 'ホスト': '127.0.0.1',
# 'db': 'server_db'
# }
# サーバーとして const.SERVER を使用して、サーバーの mysql をローカル ポート 3306 にバインドするトンネルを作成します。
  SSHConnector(server, const.server_db) をカーソルとして使用します。
    cursor.execute('テーブルを表示;')
    データ = カーソル.fetchall()
    印刷(データ)

カーソルの各種操作

1.カーソル.実行(sql_statement)

SQL文を実行する

2. カーソル.fetchall()

カーソルのすべての結果を取得します。これは、選択ステートメントの後によく使用されます。

3. カーソル.fetchone()

カーソルの最初の結果を取得する

4. カーソル.lastrowid

最後のデータID

5.カーソル.executemany(挿入ステートメント、データリスト)

バッチデータを挿入する例:

サーバーとしてconst.SERVERを使用する場合:
  カーソルとしてconnector.Connector(server, const.db_1)を使用します:
    cursor.execute('設定から*を選択')
    設定 = cursor.fetchall()

  カーソルとしてconnector.Connector(server, const.db_2)を使用します:
    cursor.executemany('設定に (`id`,`theme`,`user_id`) の値 (%s,%s,%s) を挿入',preferences)

カーソルからリスト型の結果を取得する

カーソル.execute('SELECT `name` FROM user;')

fetchall()を直接使用すると、タプルにラップされたデータしか取得できません。

カーソル.fetchall()
# (('ジャック',), ('ベン'))

ここで、Djangoのflat=Trueのようにリスト結果セットを取得したい。

2つの方法があります

リストの理解

name_list = [x[0] カーソル内の x に対して cursor.fetchall()]

この方法の欠点は、最初に fetchall() を使用して結果セットをメモリに読み込み、次にそれをリストに変換するため、効率的ではないことです。

イターツール

name_list = list(itertools.chain.from_iterable(カーソル))

この方法をお勧めします。まず、すべての結果をメモリにフェッチしません。次に、itertools を使用してリストを生成する方が、リストの理解よりも高速です。

データ移行でDjangoモデルを使用する方法

  • Django の設定ファイルをコピーし、不要な設定を削除して、移行先のデータベースを設定する必要があります。
  • このモデルで使用されるファイルをコピーする必要があります
  • models.pyファイルが配置されているディレクトリをsettings.INSTALLED_APPSに導入する必要があります。
  • 移行スクリプトの先頭でDjangoを起動します
インポートOS
ジャンゴをインポートする
インポートシステム
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "translate.settings")
django.setup()

DjangoはSSHトンネルのローカル転送を介してリモートデータベースに接続します

リモートデータベースをローカルポートにマップするためのSSHトンネルを作成します

ssh -L local_port:localhost:<リモート mysql ポート> <ユーザー名>@<リモート ホスト>

SSH接続が進行中の場合、ローカルポートにアクセスすることでリモートデータベースにアクセスできます。

Django設定でデータベースを構成する

データベース = {
  'デフォルト': {
    'エンジン': 'django.db.backends.mysql',
    'NAME': db_name、
    'USER': remote_mysql_user, # リモート データベース アカウントのパスワード 'PASSWORD': remote_mysql_password,
    'ホスト': "localhost",
    'PORT': local_port、# リモート データベースはローカル ポートにマップされます 'OPTIONS': {'init_command': 'SET default_storage_engine=INNODB;'}
    }
}

この時点で、Djangoのモデルを使用する場合、sshトンネルを介してリモートデータベースにアクセスします。

予防

  • 移行するデータの量を事前に把握し、データの5%~10%を取り出して移行速度をテストします。
  • テスト データに基づいて移行の合計時間を見積もります。移行の合計時間が 1 時間を超える場合は、移行プロセスが簡単に中断されないように、必ずサーバー上で移行スクリプトを実行してください。サーバーのパフォーマンスは、パーソナル コンピューターよりもはるかに優れています。
  • バッチ挿入を使用して、cursor.executemanyまたはDjangoのbulk_createを使用して、データベースへの書き込み回数を減らすようにしてください。
  • 移行プロセスはログに記録する必要があります。これにより、データがどのステップに移行されたかを把握でき、予期しないターミナルが発生した場合に実行を継続するためのブレークポイントを見つけることができます。
  • 作成時間フィールドと auto_add_now を組み合わせると、データの作成時間が自動的に記録されます。データを挿入するときに、このフィールドに値を割り当てると無効になります。

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

以下もご興味があるかもしれません:
  • MySQLを監視するためのbinlogログ解析ツールの詳しい説明:Canal
  • データベース管理に役立つ 5 つの MySQL GUI ツール
  • MySQL監視ツールmysql-monitorの詳細な説明
  • ツールの構築と使用の詳細な紹介。Anemometer は MySQL のスローログをグラフィカルに表示します。
  • MySQL ストレステストツールの使い方
  • Pycharm ツールが MySQL データベースに接続できませんでした
  • myisamchk および mysqlcheck ツールを使用して破損した MySQL データベース ファイルを迅速に修復する方法
  • MySQL データを誤って削除した場合の簡単な解決策 (MySQL フラッシュバック ツール)
  • KTLツールはMySQLからMySQLへのデータの同期方法を実現します
  • MySQL可視化ツールNavicatへの接続方法
  • MySQL関連のツールをいくつかお勧めします

<<:  JavaScript Canvas は動的なワイヤーフレーム効果を描画します

>>:  最新の超詳細な VMware 仮想マシンのダウンロードとインストールのグラフィック チュートリアル

推薦する

シェルを使用してMySQLデータバックアップスクリプトを作成する

アイデアそれは実はとても簡単ですシェル スクリプトを記述して、mysql の mysqldump を...

PrometheusはGrafanaディスプレイを使用してMySQLを監視します

目次Prometheusはエクスポーターを介してMySQLを監視し、Grafanaチャートで表示しま...

Zabbixで指定時間内の変化値を設定する方法の詳細な説明

背景説明: 既存の負荷分散装置には、付加価値状態にある指標があります (増加するだけで減少しないため...

MySQL パフォーマンス最適化のための魔法のツール、Explain の基本的な使用分析

導入MySQL には、SELECT ステートメントを分析し、開発者が最適化できるように SELECT...

JavaScript カスタム カレンダー効果

この記事では、JavaScriptカスタムカレンダーエフェクトの具体的なコードを参考までに紹介します...

Alibaba Cloud Server Ubuntu 上の Workbench が MySQL に接続できない問題の解決策 (テスト済み)

過去 2 日間、ワークベンチが Alibaba Cloud Server に接続できない問題を解決す...

CSS3 で六角形の境界線を実装するサンプルコード

一番外側の boxF は 120 度回転し、2 番目の boxS は -60 度回転し、3 番目の ...

メモリ構成が過剰でMySQLが起動できない問題の解決方法

問題の説明MySQL の起動時にエラーが報告されます。エラー ログを確認してください。 [エラー] ...

webpack と rollup を使用してコンポーネント ライブラリをパッケージ化する方法

序文以前、ローディングスタイルのコンポーネントを作成しました。コードの再利用性を実現するために、この...

ホバープロンプトにはvue2+elementuiを使用する

Vue2+elementui のホバー プロンプトは、外部と内部に分かれています。内部のものは el...

Vueは移動可能なフローティングボタンを実装します

この記事の例では、どこにでも移動できるフローティングボタンを実現するためのVueの具体的なコードを共...

Dockerfile における VOLUME と docker -v の違い

Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...

JavaScript イベント キャプチャ バブリングとキャプチャの詳細

目次1. イベントの流れ1. コンセプト2. DOMイベントフロー2. イベントの委任1. イベント...

MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装

テーブルを削除することはあまり一般的ではありませんが、特に外部キーの関連付けがあるテーブルの場合は、...