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 仮想マシンのダウンロードとインストールのグラフィック チュートリアル

推薦する

新しいウィンドウで開くジャンプメニュー、window.open の使い方の紹介

コードをコピーコードは次のとおりです。 <前> <div> <sele...

CSS はこのように使用できますか?気まぐれなグラデーションの芸術

前回の記事「1行のCSSコードの魅力」では、たった1行のCSSコードで生成できる美しい(奇妙な感じと...

CSS calc() の数式に関する詳細な理解

数式 calc() は CSS の関数であり、主に数学演算に使用されます。 calc() を使用する...

MySQL 8.0 における MySQL のインストールと新しいパスワード認証方法の詳細な説明

1. はじめにOracle が MySQL 8.0GA をリリースしました。海外での GA はリリー...

MySql カンマ連結文字列クエリの 2 つの方法

次の2つの関数は、 FIND_IN_SETと同じように使用されます。使用する場合、 FIND_IN_...

MySQL における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い

1. テーブルAのデータを使用してMySQLのテーブルBの内容を更新するたとえば、データ テーブル内...

Ubuntu 12.04 でカーネルツリーを構築する実装プロセスの詳細な説明

まず使用しているカーネルのバージョンを確認してくださいlin@lin-仮想マシン:~$ uname ...

SVN のインストールと基本操作 (グラフィック チュートリアル)

目次1. SVNとは何か2. SVNサーバーとクライアントの取得方法3. SVN ワークフローとアー...

Linux サーバーに Python3 をインストールする 2 つの方法

最初の方法Alibaba Cloud および Baidu Cloud サーバーが利用可能です。 ! ...

MySQLは既存のコンテンツを保持し、後でコンテンツを追加します

このコマンドは、データ テーブル ff_vod を変更し、vod_url フィールドの内容の後に 9...

win10 での mysql 8.0.16 winx64 インストールの最新グラフィック チュートリアル

このデータベースをダウンロードするには、多くの時間とトラフィックがかかります。踏み込んだ落とし穴で時...

シンプルな計算機を実装する JavaScript コード

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

Linux コマンド クエリ アプレットでの WePY クラウド開発の実践

みなさんこんにちは。今日は Linux コマンド クエリ アプレットでの WePY クラウド開発の実...

実際のプロジェクトでElementUIを使用する手順の詳細な説明

目次1. テーブル自動ソート2. ページング機能3.el-checkbox-group 複数選択ボッ...

MySQLはinet_atonとinet_ntoaを使用してIPアドレスデータを処理します。

この記事では、適切な形式を使用して IP アドレス データをデータベースに保存し、IP アドレスを簡...