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

推薦する

uniappとvueの違いの詳細な説明

目次1. シンプルなページの例2.uni-appはvueコンポーネントとミニプログラムネイティブコン...

Dockerfile を使用して SpringBoot プロジェクトをデプロイする方法

1. SpringBoootプロジェクトを作成し、jarパッケージにパッケージ化する2. Linux...

MySQL は重複データを削除して最小の ID ソリューションを維持します

オンラインで検索して重複データを削除し、ID が最小のデータだけを残します。方法は次のとおりです。 ...

JavaScript 配列重複排除問題の詳細な研究

目次序文 👀リサーチを始めましょう🐱‍🏍オリジナル🧶 indexOf を使用した元の方法の最適化 ✍...

MySQLでデータベースデータ保存ディレクトリを変更する方法

序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...

mysql5.7.18 のインストール時にエントリが見つからない問題の解決方法

mysql5.7.18のインストール時に次の問題が発生しました: プログラム入力ポイントfesetr...

MySQL パフォーマンス最適化のヒント

MySQL パフォーマンスの最適化MySQL はインターネット企業で広く使用されており、MySQL ...

面接の質問: 3 行 3 列のレイアウト、表は結合され、ネストされた表は許可されません

面接の質問で、3 行 3 列のレイアウトが求められます。1 行目の 2 番目の列と 2 行目の 2 ...

Kali Linux Vmware 仮想マシンのインストール (図とテキスト)

準備: 1. VMwareワークステーションソフトウェアをインストールする2. Kali Linux...

MySQL でのテーブルの作成と削除の詳細な例

テーブル作成コマンドには以下が必要です。 テーブルの名前フィールド名各フィールドを定義します(タイ...

Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

目次実際のプロジェクトで遭遇する要件実装が間違っているところもある私は個人的に、実装するより良い方法...

Deepin で virtualenv をインストールして使用するチュートリアル

virtualenv は、分離された Python 仮想環境を作成するためのツールです。独立したディ...

Dockerを使用してPythonランタイム環境の基本イメージを作成する方法

1. 準備1.1 Pythonインストールパッケージをダウンロードします(注:Pythonバージョン...