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 5.7 解凍版のインストールとアンインストール、およびよくある問題の概要

1. インストール1. ダウンロードMySQLをダウンロードするには、MySQL公式サイトhttp:...

Linux テキスト検索コマンド find の詳細な使用方法

find コマンドは主にディレクトリやファイルを検索するために使用され、一致のために複数のパラメータ...

ストアド プロシージャでエラー状態をトリガーする mysql ストアド プロシージャの分析例 (SIGNAL および RESIGNAL ステートメント)

この記事では、例を使用して、MySQL がストアド プロシージャで引き起こすエラー状態 (SIGNA...

JS初心者が配列を処理するための実践的な方法のまとめ

join() メソッド: 指定された区切り文字を使用して配列内のすべての要素を文字列に接続します。例...

MAC での MYSQL5.7.17 接続失敗の問題と解決策

MYSQL5.7.17 が MAC で接続できない問題。SQLBench_community 6.3...

Linux で Apache を使用してファイル サーバーを構築する手順

1. ファイルサーバーについてプロジェクトでは、公開ソフトウェアやデータをプロジェクト チーム メン...

MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思...

border-radius 値の設定に関する質問

問題記録今日はプログレスバーに似た小さなコンポーネントを完成させるつもりでした。プロトタイプは次のよ...

Vue を使用した Amap アプリケーション開発のベスト プラクティス

目次序文非同期読み込みパッケージコンポーネントコンポーネントの使用インターフェースをカスタマイズする...

セマンティックタグを使用して、IE6、7、8と互換性のあるHTMLを記述します。

HTML5 では、ヘッダー、フッター、ナビゲーションなどのセマンティック タグが追加されているため...

docker compose を使用して FastDfs ファイル サーバーをインストールする詳細な例

ドッカーの作成 バージョン: '2' サービス: fastdfsトラッカー: ホスト...

LinuxにNginxをインストールする正しい手順

序文私のように、Java バックエンドに勤勉な人であれば、多数のプロジェクト機能を実装することに加え...

擬似分散グラフィックを実現するための VMware 構成 Hadoop チュートリアル

1. 実験環境シリアルナンバープロジェクトソフトウェアとバージョン1オペレーティング·システムCen...

Angularルーティングサブルートの詳細な説明

目次1. サブルート構文2. 例1. 2つの新しいコンポーネントを作成し、その内容を変更する2. ル...

Node.jsで子プロセスを作成する方法

目次導入子プロセスプロセスを非同期的に作成する同期作成プロセス導入Node.js のメイン イベント...