久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Mysql數據遷徙方法工具的示例分析

147次閱讀
沒有評論

共計 3946 個字符,預計需要花費 10 分鐘才能閱讀完成。

這篇文章給大家分享的是有關 Mysql 數據遷徙方法工具的示例分析的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。

數據遷徙是每個后端都會遇到的工作之一,本文介紹了一些常見的數據遷徙方法與工具

mysqldump:數據結構不變的數據遷徙

導出數據

mysqldump -u root -p DATABASE_NAME table_name   dump.sql

恢復數據

mysql -u root -p DATABESE_NAME   dump.sql

或者連接 mysql 客戶端

mysql  source dump.sql

使用 pymysql 連接數據庫

可以直接用用戶名密碼連接的數據庫

class GeneralConnector:
 def __init__(self, config, return_dic=False):
 self.return_dic = return_dic
 self.config = config
 def __enter__(self):
 self.conn = pymysql.connect(**self.config, port=3306)
 if self.return_dic:
 #  一行數據會變成一個字典
 self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
 else:
 self.cursor = self.conn.cursor()
 return self.cursor
 def __exit__(self, *args):
 self.cursor.close()
 self.conn.commit()
 self.conn.close()

使用:

# local_db = {
#  user :  root ,
#  passwd :  ,
#  host :  127.0.0.1 ,
#  db :  local_db 
# }
with GeneralConnector(const.local_db, return_dic=True) as cursor:
 cursor.execute(SELECT `col1`, `col2` FROM test;)
 return cursor.fetchall()

連接處于需要 SSH 連接的服務器的數據庫

class SSHConnector:
 def __init__(self, server, config, return_dic=False):
 self.return_dic=return_dic
 self.server = server
 self.config = config
 def __enter__(self):
 self.conn = pymysql.connect(**self.config, port=self.server.local_bind_port)
 if self.return_dic:
 #  一行數據會變成一個字典
 self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
 else:
 self.cursor = self.conn.cursor()
 return self.cursor
 def __exit__(self, *args):
 self.cursor.close()
 self.conn.commit()
 self.conn.close()

使用:

# SERVER = SSHTunnelForwarder(# (remote_host, ssh_port),
# ssh_username=USERNAME,
# ssh_pkey=SSH_KEY,
# ssh_private_key_password=SSH_KEY_PASSWD,
# remote_bind_address=(127.0.0.1 , 3306) # mysql 服務位置
# )
# server_db = {
#  user :  root ,
#  passwd :  ,
#  host :  127.0.0.1 ,
#  db :  server_db 
# }
#  創建一個隧道將服務端的 mysql 綁定到本地 3306 端口
with const.SERVER as server:
 with SSHConnector(server, const.server_db) as cursor:
 cursor.execute(show tables;)
 data = cursor.fetchall()
 print(data)

cursor 的各種操作

1.cursor.execute(sql_statement)

執行一條 sql 語句

2.cursor.fetchall()

獲取 cursor 的所有結果,常跟在 select 語句后使用

3.cursor.fetchone()

獲取 cursor 的第一條結果

4.cursor.lastrowid

最后一條數據的 id

5.cursor.executemany(insert_statement, data_list)

批量插入一批數據,如

with const.SERVER as server:
 with connector.Connector(server, const.db_1) as cursor:
 cursor.execute(select * from preference)
 preferences = cursor.fetchall()
 with connector.Connector(server, const.db_2) as cursor:
 cursor.executemany(insert into preference (`id`,`theme`,`user_id`) values (%s,%s,%s) ,preferences)

從 cursor 獲取 list 類型的結果

cursor.execute(SELECT `name` FROM user;)

直接使用 fetchall(),只能得到 tuple 包裹的數據

cursor.fetchall()
# ((Jack ,), (Ben))

現在希望得到一個 list 結果集,做到像 Django 中 flat=True 那樣的效果

有兩種方法

列表解析式 (list comprehension)

name_list = [x[0] for x in cursor.fetchall()]

這個方法的缺點在于會先使用 fetchall() 將結果集讀到內存,再做列表轉換,并不高效。

itertools 工具

name_list = list(itertools.chain.from_iterable(cursor))

推薦使用這個方式,第一它不會將所有結果 fetch 到內存中,第二使用 itertools 生成列表比列表解析式要快

如何在數據遷徙中使用 Django 的 model

需要拷貝 Django 的 settings 文件,刪掉不需要的配置,并設置好遷徙目標數據庫

需要拷貝用到此 model 的文件

需要在 settings.INSTALLED_APPS 中引入 models.py 文件所在的目錄

在遷徙腳本頭部啟動 Django

import os
import django
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
os.environ.setdefault(DJANGO_SETTINGS_MODULE ,  translate.settings)
django.setup()

通過 SSH 隧道的本地轉發實現 Django 連接遠程數據庫

創建一個 ssh 隧道,將遠程數據庫映射到本地端口

ssh -L local_port:localhost: remote mysql port   username @ remote host

ssh 連接進行時,可以通過訪問本地端口來訪問遠程數據庫

在 Django 的 settings 中配置數據庫

DATABASES = {
  default : {
  ENGINE :  django.db.backends.mysql ,
  NAME : db_name,
  USER : remote_mysql_user, #  遠程數據庫賬號密碼
  PASSWORD : remote_mysql_password,
  HOST :  localhost ,
  PORT : local_port, #  遠程數據庫映射到本地的端口
  OPTIONS : {init_command :  SET default_storage_engine=INNODB;}
 }
}

至此,在使用 Django 的 model 時,將通過 ssh 隧道訪問遠程數據庫

注意事項

事先了解遷徙數據量,并且取 5%~10% 的數據測試遷徙速度

由測試數據預估總遷徙用時,如果總遷徙用時大于一小時,一定要把遷徙腳本放到服務器運行,這樣遷徙過程不易中斷,且服務器性能遠比個人電腦更優

盡量使用批量插入減少寫數據庫的次數,使用 cursor.executemany 或者 Django 的 bulk_create

遷徙過程要寫好 log,這樣能夠知道數據遷徙到了哪一步,如意外終端也能找到斷點繼續運行

創建時間字段加上 auto_add_now 會自動記錄數據的創建時間,在插入數據的時候對這個字段賦值無效

感謝各位的閱讀!關于“Mysql 數據遷徙方法工具的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計3946字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 尼勒克县| 类乌齐县| 志丹县| 临湘市| 枞阳县| 阜平县| 潜山县| 怀柔区| 阳西县| 福鼎市| 万州区| 锦州市| 正镶白旗| 九江县| 河源市| 康平县| 施秉县| 乌兰察布市| 平武县| 荆州市| 马尔康县| 浙江省| 湖北省| 颍上县| 赞皇县| 天台县| 东乡族自治县| 新绛县| 灵宝市| 安达市| 靖西县| 长岭县| 东安县| 襄汾县| 永城市| 扶沟县| 新郑市| 富锦市| 安义县| 商洛市| 玛纳斯县|