Mysql数据迁徙方法工具的示例分析
这篇文章给大家分享的是有关Mysql数据迁徙方法工具的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁徙方法与工具
mysqldump:数据结构不变的数据迁徙
导出数据
mysqldump-uroot-pDATABASE_NAMEtable_name>dump.sql
恢复数据
mysql-uroot-pDATABESE_NAME<dump.sql
或者连接mysql客户端
mysql>sourcedump.sql
使用pymysql连接数据库
可以直接用用户名密码连接的数据库
classGeneralConnector:def__init__(self,config,return_dic=False):self.return_dic=return_dicself.config=configdef__enter__(self):self.conn=pymysql.connect(**self.config,port=3306)ifself.return_dic:#一行数据会变成一个字典self.cursor=self.conn.cursor(pymysql.cursors.DictCursor)else:self.cursor=self.conn.cursor()returnself.cursordef__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'#}withGeneralConnector(const.local_db,return_dic=True)ascursor:cursor.execute('SELECT`col1`,`col2`FROMtest;')returncursor.fetchall()
连接处于需要SSH连接的服务器的数据库
classSSHConnector:def__init__(self,server,config,return_dic=False):self.return_dic=return_dicself.server=serverself.config=configdef__enter__(self):self.conn=pymysql.connect(**self.config,port=self.server.local_bind_port)ifself.return_dic:#一行数据会变成一个字典self.cursor=self.conn.cursor(pymysql.cursors.DictCursor)else:self.cursor=self.conn.cursor()returnself.cursordef__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端口withconst.SERVERasserver:withSSHConnector(server,const.server_db)ascursor:cursor.execute('showtables;')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)
批量插入一批数据,如
withconst.SERVERasserver:withconnector.Connector(server,const.db_1)ascursor:cursor.execute('select*frompreference')preferences=cursor.fetchall()withconnector.Connector(server,const.db_2)ascursor:cursor.executemany('insertintopreference(`id`,`theme`,`user_id`)values(%s,%s,%s)',preferences)
从cursor获取list类型的结果
cursor.execute('SELECT`name`FROMuser;')
直接使用fetchall(),只能得到tuple包裹的数据
cursor.fetchall()#(('Jack',),('Ben'))
现在希望得到一个list结果集,做到像Django中flat=True那样的效果
有两种方法
列表解析式(list comprehension)
name_list=[x[0]forxincursor.fetchall()]
这个方法的缺点在于会先使用fetchall()将结果集读到内存,再做列表转换,并不高效。
itertools工具
name_list=list(itertools.chain.from_iterable(cursor))
推荐使用这个方式,第一它不会将所有结果fetch到内存中,第二使用itertools生成列表比列表解析式要快
如何在数据迁徙中使用Django的model
需要拷贝Django的settings文件,删掉不需要的配置,并设置好迁徙目标数据库
需要拷贝用到此model的文件
需要在settings.INSTALLED_APPS中引入models.py文件所在的目录
在迁徙脚本头部启动Django
importosimportdjangoimportsyssys.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-Llocal_port:localhost:<remotemysqlport><username>@<remotehost>
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':'SETdefault_storage_engine=INNODB;'}}}
至此,在使用Django的model时,将通过ssh隧道访问远程数据库
注意事项
事先了解迁徙数据量,并且取5%~10%的数据测试迁徙速度
由测试数据预估总迁徙用时,如果总迁徙用时大于一小时,一定要把迁徙脚本放到服务器运行,这样迁徙过程不易中断,且服务器性能远比个人电脑更优
尽量使用批量插入减少写数据库的次数,使用cursor.executemany或者Django的bulk_create
迁徙过程要写好log,这样能够知道数据迁徙到了哪一步,如意外终端也能找到断点继续运行
创建时间字段加上auto_add_now会自动记录数据的创建时间,在插入数据的时候对这个字段赋值无效
感谢各位的阅读!关于“Mysql数据迁徙方法工具的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。