日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql数据库迁徙_mysql数据迁徙详解

發布時間:2023/12/2 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql数据库迁徙_mysql数据迁徙详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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的各種操作

cursor.execute(sql_statement)

執行一條sql語句

cursor.fetchall()

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

cursor.fetchone()

獲取cursor的第一條結果

cursor.lastrowid

最后一條數據的id

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:@

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数据库迁徙_mysql数据迁徙详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。