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会自动记录数据的创建时间,在插入数据的时候对这个字段赋值无效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

junit-4.9.jar_JUnit 4.9(测试版3)中的规则

junit-4.9.jar不久前&#xff0c; David Saff宣布了JUnit 4.9的beta版 。 因此&#xff0c;我认为现在是研究该版本中的新增功能的好时机。 JUnit领域中最有用的创新之一是Rule。 我在这里写了有关规则的文章 。 我在这里写了有关JUnit规则的用例 。 规则很棒。 借助JUnit 4.9&…

封装js千分位加逗号和删除逗号

//封装js千分位加逗号和删除逗号alert( format(2545678754.020001) ) //2,545,678,754.03alert( format(-2545678754.020001) ) //-2,545,678,754.02alert( format(2545678754.000000000009) ); //当值很长的时候会出现数字被截取的问题alert( delformat(2,545,678,75…

java集成_Java继承

一.继承1.简介&#xff1a;特点&#xff1a;利于代码复用&#xff1b;缩短开发周期。注&#xff1a;子类不能直接访问父类的私有属性满足“A is a B”的关系就可以形成继承关系例&#xff1a;父类&#xff1a;1 packagecom.swpu.animals;23 public classAnimal {4 //属性5 priv…

查找任意数目参数的最大值

查找任意数目参数的最大值 原文:查找任意数目参数的最大值《C和指针》第7章第4道编程题&#xff1a; 编写一个名叫max_list的函数&#xff0c;它用于检查任意数目的整型参数并返回它们中的最大值。参数列表必须以一个负值结尾&#xff0c;提示列表的结束。 1 /*2 ** 查找任意数…

如何以大数据的JAX-RS响应的形式将JPA结果流化/序列化

有时&#xff0c;有必要通过JPA检索大型数据集&#xff08;例如&#xff0c;超过1,000,000条记录&#xff09;&#xff0c;并将它们填充到java.util.List的单个实例中是有风险的&#xff08;内存障碍&#xff09;。 因此&#xff0c;这是一个快速的解决方案&#xff0c;它可以解…

Tab标签页接口---使用Intent对象

TabHost tabHost getTabHost();Intent it new Intent();it.setClass(Main.this, DateTimePicker.class);TabSpec spectabHost.newTabSpec("tab1");spec.setContent(it);spec.setIndicator("ら戳㎝丁",getResources().getDrawable(android.R.drawable.i…

java猜数字小游戏_Java实现简单猜数字小游戏

本文实例为大家分享了Java实现猜数字游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下完成猜数字游戏需要实现以下几点&#xff1a;获得一个随机数作为“答案数”&#xff1b; 输入数字&#xff0c;与“答案数”作比较(判断大了&#xff0c;小了&#xff0c;相等…

要看的东西

udp发送、接受 tcp 客户端 服务端 http&#xff08;servlet&#xff09; http post http get web service cookies session 多线程 io流 集合list set map&#xff1a;循环、迭代器 jmeter、soapui、webdriver、python转载于:https://www.cnblogs.com/stay-sober/p/4158837.h…

简单的基准测试:不可变集合VS持久集合

通常&#xff0c;您需要向集合中添加新元素。 因为您是一个优秀而谨慎的开发人员&#xff0c;所以您希望尽可能保持不变。 因此&#xff0c;向不可变集合中添加新元素将意味着您必须创建一个新的不可变集合&#xff0c;其中包含原始集合的所有元素以及新元素。 您可以使用gua…

java list 合并去重_java 怎么把多个list 合并成一个去掉重复的

展开全部示例代码636f707962616964757a686964616f31333361313838:public static void main(String[] args){List list1 new ArrayList();list1.add(1);list1.add(2);list1.add(3);list1.add(4);List list2 new ArrayList();list2.add(1);list2.add(4);list2.add(7);list2.add…

UITextField实现左侧空出一定的边距

就是通过uitextfield的leftview来实现的&#xff0c;同时要设置leftviewmode。 如果设置左右边距&#xff0c;需要再加上rightView功能 -(void)setTextFieldLeftPadding:(UITextField *)textField forWidth:(CGFloat)leftWidth {CGRect frame textField.frame;frame.size.widt…

java软件工程师 英文简历_2017java程序员英文简历范文

2017java程序员英文简历范文简历写完以后&#xff0c;再检查一下你的简历是否回答了以下问题&#xff1a;它是否清楚并能够让雇主尽快知道你的能力?是否写清了你的能力?是否写清了你要求这份工作的.基础?有东西可删除吗?尽力完善你的简历直到最好。2017java程序员英文简历范…

写给java web一年左右工作经验的人

摘要 大学就开始学习web&#xff0c;磕磕绊绊一路走过来&#xff0c;当中得到过开源社区很多的帮助&#xff0c;总结了这些年来的技术积累&#xff0c;回馈给开源社区。 ps&#xff1a;图片都是从网上盗。。。感谢原作者。 ps&#xff1a;文字千真万确都是我自己写的。 在此&am…

FlexyPool如何支持Dropwizard Metrics包重命名

介绍 FlexyPool严重依赖Dropwizard &#xff08;以前是Codahale&#xff09;度量标准来监视连接池的使用情况 。 集成到Dropwizard中后&#xff0c;程序包名称必然会被重命名 。 因此&#xff0c;4.0.0版本将使用io.dropwizard.metrics软件包名称代替com.codahale.metrics 。 …

java网络编程与分布式计算_Java网络编程与分布式计算

基本信息书名:Java网络编程与分布式计算定价&#xff1a;38.00元作者:[澳]赖利出版社&#xff1a;机械工业出版社出版日期&#xff1a;2003-03-00ISBN&#xff1a;9787111115786字数&#xff1a;页码&#xff1a;版次&#xff1a;装帧&#xff1a;开本&#xff1a;编辑推荐内容…

java ref 应用类型_Java四种引用类型

Java四种引用类型在java中&#xff0c;类型就分为两种&#xff0c;基本类型和引用类型或自定义类型。引用类型又分为四种&#xff1a;强引用 StrongReference软引用 SoftReference若引用 WeakReference虚引用 PhantomReference划分这些类型的目的是&#xff1a;是为了更灵活的管…

嵌入式Linux学习笔记

一 嵌入式系统定义&#xff1a; 应用于特定环境的硬件体系。 二 两样非常重要的能力&#xff1a; 1. 掌握各种新概念的能力 2. 调试的能力( 包括软件, 硬件 ) 三 需要的基础知识&#xff1a; 1. 操作系统理论基础 2. 数据结构 3. C,C编程语言 4. 汇编语言 5. Linux基…

java string 内存占用_JVM系列之:String,数组和集合类的内存占用大小

简介之前的文章中&#xff0c;我们使用JOL工具简单的分析过String,数组和集合类的内存占用情况&#xff0c;这里再做一次更详细的分析和介绍&#xff0c;希望大家后面再遇到OOM问题的时候不再抱头痛哭&#xff0c;而是可以有章可循&#xff0c;开始吧。数组先看下JOL的代码和输…

maven osgi_OSGi将Maven与Equinox结合使用

maven osgi很长时间以来&#xff0c;我一直在努力理解OSGi的真正含义。 它已经存在很长时间了&#xff0c;但是没有多少人意识到这一点。 它被炒作是一种非常复杂的技术。 这是我为所有Java开发人员简化的尝试。 简而言之&#xff0c; OSGi是一组规范&#xff0c;这些规范支持模…

java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

这段时间一直有人问如何在Redis中缓存Java中的List 集合数据&#xff0c;其实很简单&#xff0c;常用的方式有两种&#xff1a;1. 利用序列化&#xff0c;把对象序列化成二进制格式&#xff0c;Redis 提供了 相关API方法存储二进制&#xff0c;取数据时再反序列化回来&#xff…