mysql如何备份一个表单_Mysql亿级数据大表单表备份

上一篇Mysql已有亿级数据大表按时间分区,介绍了亿级数据大表如何按时间分区,也留下了一个问题:备份亿级数据大表要耗时多久。本篇将就如何备份亿级数据大表展开讨论。

注意:我这里所说的备份指的是数据从一张表拷贝到另外一张表,也就是说单表备份。

创建原表t_send_message_send的sql:

CREATE TABLE `t_send_message_send` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`plan_id` bigint(20) DEFAULT NULL,

`job_uuid` varchar(36) DEFAULT NULL,

`send_port` varchar(16) DEFAULT NULL,

`mobile` varchar(16) DEFAULT NULL,

`content` varchar(200) DEFAULT NULL,

`product_code` varchar(16) DEFAULT 'HELP',

`fake` bit(1) DEFAULT b'0',

`date_push` datetime DEFAULT NULL,

`activity_id` bigint(20) DEFAULT '0',

PRIMARY KEY (`id`),

KEY `mobile` (`mobile`),

KEY `date_push` (`date_push`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

原表一个自增主键id,两个索引mobile、date_push,数据量如下图:

ad8c5e5c14fd643cb15a5f537206d105.png

创建新表的t_send_message_send2的sql:

CREATE TABLE `t_send_message_send2` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`plan_id` bigint(20) DEFAULT NULL,

`job_uuid` varchar(36) DEFAULT NULL,

`send_port` varchar(16) DEFAULT NULL,

`mobile` varchar(16) DEFAULT NULL,

`content` varchar(200) DEFAULT NULL,

`product_code` varchar(16) DEFAULT 'HELP',

`fake` bit(1) DEFAULT b'0',

`date_push` datetime NOT NULL,

`activity_id` bigint(20) DEFAULT '0',

PRIMARY KEY (`id`,`date_push`),

KEY `mobile` (`mobile`),

KEY `date_push` (`date_push`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION BY RANGE COLUMNS(date_push)

(PARTITION p2016 VALUES LESS THAN ('2017-01-01') ENGINE = InnoDB,

PARTITION p2017 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB,

PARTITION p2018 VALUES LESS THAN ('2019-01-01') ENGINE = InnoDB,

PARTITION p2019 VALUES LESS THAN ('2020-01-01') ENGINE = InnoDB,

PARTITION p2020 VALUES LESS THAN ('2021-01-01') ENGINE = InnoDB);

新表一个联合主键(id,date_push),两个索引mobile、date_push,5个分区,字段和结构跟原表一样,数据量为0。

上一篇提供了两类备份方式:①在线备份;②离线备份。

1.在线备份;

数据一直在数据库中不离线。

insert into t_send_message_send2 (select * from t_send_message_send);

sql很简单,意思很明确,就是将select的查询结果插入到t_send_message_send2。这个过程我跑了一个多小时,没跑完,被我中止了。用navicate查看t_send_message_send2的对象信息,看到有500多万行记录,打开t_send_message_send2表,里面一行记录都没有,空的。应该是请求中止了,数据还没提交。好吧,看下为什么慢,解析下:

EXPLAIN

insert into t_send_message_send2 (select * from t_send_message_send);

执行结果:

"id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"

"1""INSERT""t_send_message_send2""p2016,p2017,p2018,p2019,p2020""ALL"""""""""""""""

"1""SIMPLE""t_send_message_send""""ALL""""""""""100568970""100.00"""

好家伙,第5列type都是ALL。type表示MySQL在表中找到所需行的方式,又称“访问类型”。常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从前往后,性能从差到好)。ALL,Full Table Scan, MySQL将遍历全表以找到匹配的行。明白了吧,每次插入全表扫描,这能不慢吗?

2. 离线备份

数据先导出到本地,再从本地导回数据库。

1)数据导出(数据备份)

离线备份也分为冷备和热备。

冷备:数据库处于关闭的状态下的备份,优点是:①保证数据库的完整性;②备份过程简单并且恢复速度快。缺点是:①关闭数据库,意味着相关的业务无法正常进行,用户无法访问你的业务,一般冷备用于不是很重要、非核心业务上面。

冷备显然是不满足我的业务需求的,冷备是全库备份,而我只是单表备份。

热备:数据库处于运行状态下的备份,不影响现有业务的进行。热备又分为裸文件备份和逻辑备份。裸文件备份:基于底层数据文件的copy datafile。进入到数据库的数据目录,再进入到你的库目录,你会发现在这个目录下有很多.frm文件和.ibd文件,.frm文件是表的结构文件,.ibd文件是表的数据文件。逻辑备份:备份成SQL语句或者其他文件(如csv),恢复时执行SQL,实现数据库数据的重现。

裸文件备份显然也是全库备份,也是不满足我的业务需求的,下面讨论逻辑备份。

逻辑备份常见的两种方式:

①mysqldump

mysqldump -u root -p marketing t_send_message_send > e:/mysql/marketing_t_send_message_send.sql;

哈哈哈,暴露了在windows上操作的。

mysqldump导出相当快,亿级的记录,50多个G数据量,大概仅用了40分钟左右。没记录到具体时间,是因为执行这个脚本不需要登录到mysql,命令行就可以了,而命令行不会提示执行脚本花了多长时间,如果登录mysql,每次执行都会提示执行脚本好了多长时间。

②select … into outfile …;

mysql> use marketing;

Database changed

mysql> select * from t_send_message_send into outfile 'e:/mysql/t_send_message_send.csv';

Query OK, 110900005 rows affected (34 min 10.22 sec)

mysql>

亿级的记录,50多个G数据量,仅需要34分钟,就问你快不快?

2)数据导入(数据恢复)

①mysqldump方式导出的

mysql> use marketing;

Database changed

mysql> source e:/mysql/marketing_t_send_message_send.sql

或者

mysql -uroot -p marketing < e:/mysql/marketing_t_send_message_send.sql

mysqldump方式不满足我的业务需求的,mysqldump备份了整个t_send_message_send表,包括表结构,而表结构是我不需要的,如果恢复的话,只会是恢复成t_send_message_send,数据不会恢复到t_send_message_send2中。

②select … into outfile …;导出的

mysql> use marketing;

Database changed

mysql> load data infile 'e:/mysql/t_send_message_send.csv' into table t_send_message_send2;

或者

将备份的t_send_message_send.csv重命名为t_send_message_send2.csv,然后命令行里面执行:

mysqlimport -u root -p marketing e:/mysql/t_send_message_send2.csv

很遗憾,这种方式不可行,我从凌晨1点开始执行,到早上9点多还没执行完。七八个小时,插入了2700多万记录,13个G数据量,1.7个G索引。

2997baa3ad1f6b11149b59a770d4002c.png

之前我一直觉得应该是可行的,开始执行的那一刻我就感觉不对。分析下了原因,大概是因为有索引。我的理解是这样的:索引相当于排序,插入数据前,还得先全表扫描下,才晓得数据应该插入到哪个位置,插入一亿条记录,就得一亿次全表扫描,这能不慢吗?那既然这样,先把索引删了,先不排序,数据直接插到最后面,等数据插完之后再排序,再建索引,这样应该会快一些。开搞,先删除索引:

##先truncate掉t_send_message_send2##

TRUNCATE TABLE t_send_message_send2;

ALTER TABLE t_send_message_send2 DROP INDEX mobile;

ALTER TABLE t_send_message_send2 DROP INDEX date_push;

然后再次导入。

C:\Users\maanjun>mysqlimport -u root -p marketing e:/mysql/t_send_message_send2.csv

Enter password: ******

marketing.t_send_message_send2: Records: 110900005 Deleted: 0 Skipped: 0 Warnings: 0

耗时3个多小时,跟Mysql数据库快速插入亿级数据差不多。最后,再重建索引:

ALTER TABLE `t_send_message_send2` ADD INDEX (mobile);

ALTER TABLE `t_send_message_send2` ADD INDEX (date_push);

重建两个索引,一个varchar类型,一个datetime类型,建一个索引差不多二三十分钟,加上数据导入过程耗时,数据导入、重建索引总共耗时4个小时。

回过头来想,插入数据前删除索引,然后插入数据,最后重建索引,不管是哪种导入方式差不多都是耗时3个多小时,加上重建索引的时间,整个恢复过程差不多4个小时。再加上导出耗费的时间,5个小时内亿级记录表单表备份是可以的。当然这说的离线备份,其实如果顺利的话,在线备份花费的时间会更短,因为在线备份也可以是删除索引–>插入数据–>重建索引这个过程,况且在线备份不需要耗费导出数据这段时间。其次,在线备份也不需要占用本地几十个G的中转空间。但是在线备份一定好吗?未必!在线备份频繁地查询原表,会不会影响线网业务?我是在本机测试的,直接操作数据库,没有业务在跑,当然没有关系,如果是线网那就值得考虑下啦。再者,我在用navicate进行在线备份过程中连接无故中断了。

[SQL]insert into t_send_message_send2 (select * from t_send_message_send);

[Err] 2013 - Lost connection to MySQL server during query

在数据导出导入过程中还踩了一些,这些坑在百度上搜一下,都有解决方法。下一篇,将对整个mysql亿级数据大表分区的过程做个总结。

附:

type

表示MySQL在表中找到所需行的方式,又称“访问类型”。

常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

range:只检索给定范围的行,使用一个索引来选择行

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

更多explain解释,参见MySQL Explain详解

1、https://www.cnblogs.com/xuanzhi201111/p/4175635.html

2、https://blog.csdn.net/weixin_44297303/article/details/99197637

3、https://www.jianshu.com/p/c64b857a9996

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

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

相关文章

mysql mos login_MySQL 中常用的函数

一、DATE_FORMAT()需求&#xff1a;按照日期月份统计数据&#xff0c;但数据库存储的格式是 2020-10-01 10:20:45 &#xff0c;因此需要格式化日期语法&#xff1a;DATE_FORMAT(date,format)第一个参数&#xff1a;指定的日期&#xff0c;第二个参数&#xff1a;需要获取的格式…

需求调研的方法及过程_培训需求调研方法

课程设计与开发是每一位职业培训师都必须会的技能&#xff0c;今天我们就来分享一下如何开发课程。第一节课&#xff0c;让我们先从培训需求调研开始。培训需求调研方法有很多&#xff0c;从个体层次分为&#xff1a;问卷法、观察法、访谈法&#xff1b;从组织层次分为&#xf…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过&#xff0c;如果没有&#xff0c;推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》&#xff0c;课程目录如下&#xff1a; Ubuntu22安装Vscode 下载&#xff1a;https://code.visualstudio.com/Download 安装命令&#…

mysql分表 动态扩容_数据库hash分表后的扩容方案

postgres的hash分表不停机扩容方案原来我们hash分表之后&#xff0c;数据扩容采用的是rehash&#xff0c;这样迁移全部的数据&#xff0c;比较麻烦。本次扩容利用hash环原理&#xff0c;并在此基础上做一些适应性的改动。首先假定哈希环的范围为0-1023&#xff0c;总共1024的数…

php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池

PHP连接MysqL的方式&#xff0c;用的多的是MysqL扩展、MysqLi扩展、pdo_MysqL扩展,是官方提供的。PHP的运行机制是页面执行完会释放所有该PHP进程中的所有资源的&#xff0c;如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据PHP跟web服务器的不同&#xff0c;会开…

python 读取地震道头数据_python地震数据可视化详解

本文实例为大家分享了python地震数据可视化的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下准备工作&#xff1a;在windows10下安装python3.7&#xff0c;下载参考源码到本地。1. demo绘图测试demo绘图指令cmd> python seisplot.py --demo问题1)缺少依赖包File &…

java程序员 css_Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)

七.组织元素(span和div)span和div元素用于组织和结构化文档&#xff0c;并经常联合class和id属性一起使用。在这一课中&#xff0c;我们将进一步探究span和div的用法&#xff0c;因为这两个HTML元素对于CSS是很重要的。用span组织元素用div组织元素用span组织元素span元素可以说…

java set泛型_Java 集合二 泛型、Set相关

泛型1、在定义一个类的方法时&#xff0c;因为不确定返回值类型&#xff0c;所以用一个符号代替&#xff0c;这个符号就是泛型eg:ArrayList list new ArrayList();2、泛型的好处&#xff1a;1、提高了数据的安全性&#xff0c;将运行时的问题提前暴露在编译阶段2、避免了强转的…

java gson_Java 中 Gson的使用

JSON 是一种文本形式的数据交换格式&#xff0c;它比XML更轻量、比二进制容易阅读和编写&#xff0c;调式也更加方便;解析和生成的方式很多&#xff0c;Java中最常用的类库有&#xff1a;JSON-Java、Gson、Jackson、FastJson等一、Gson的基本用法Gson提供了fromJson() 和toJson…

java web 集成dom4j_[JavaWeb基础] 031.dom4j写入xml的方法

上一篇我们讲述了dom4j读取xml的4种方法&#xff0c;甚是精彩&#xff0c;那么怎么样写入xml呢&#xff1f;我们直接看下源码实现。public static void main(String[] args) throws Exception {// 创建文档Document document DocumentHelper.createDocument();// 设置编码docu…

java servlet 调试日志 logger sae_java servlet 调试日志 lo

java servlet 调试日志 lo[2021-02-10 08:32:08] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#x…

求java简单计算器源代码_java简单计算器源代码

简单计算器代码package calcultorthree;import java.awt.BorderLayout;//导入边界布局管理器类import java.awt.GridLayout;//导入网格布局管理器类import java.awt.TextField;//导入文本区域类import java.awt.event.ActionEvent;//导入事件类import java.awt.event.ActionLis…

java遍历斐波纳契数列_详解循环、迭代、递归、分治(Leet Code 509 斐波那契数列),实际运用...

Multiple solutions of Fibonacci (Python or Java)本章是用英文写的&#xff0c;作为或想成为一名优秀的攻城狮&#xff0c;习惯阅读英文文档将使你受益良多。例如更好的查看最新版的官方文档、与国外友人交流、等等 其实英文的生词也并不多,其中90&#xff05;的英文都在代码…

java 二分查找 排序_java 冒泡排序 二分查找

下面这个程序是先定义一个整型数组&#xff0c;然后将其中的元素反序赋值&#xff0c;再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数&#xff0c;返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值&#xff0c;-2表示这个数比这个数组的最小…

php里h和h的区别吗,编码h264h和h264b有什么区别

区别如下&#xff1a;1、版本H.265是新的编码协议&#xff0c;也即是H.264的升级版。H.265标准保留H.264原来的某些技术&#xff0c;同时对一些相关的技术加以改进。新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系&#xff0c;达到最优化设置。2、储…

php 抽象类 静态方法吗,php中的抽象类和静态方法是什么

php中的抽象类是指&#xff1a;在class前加了abstract关键字且存在抽象方法的类&#xff0c;它不能被直接实例化&#xff1b;静态方法是指&#xff1a;被static关键字修饰的方法&#xff0c;静态方法用于操作静态属性。抽象类抽象类是指在 class 前加了 abstract 关键字且存在抽…

centos 怎样下载php,centos下怎样安装软件

centos下安装软件的方法是&#xff1a;centos安装软件的命令1、rpm包的安装1.安装一个包# rpm -ivh2.升级一个包# rpm -Uvh3.移走一个包# rpm -e4.安装参数--force 即使覆盖属于其它包的文件也强迫安装--nodeps 如果该RPM包的安装依赖其它包&#xff0c;即使其它包没装&#xf…

php post 微信沙箱,微信支付平台错误:获取沙箱密钥失败,确保交易密钥是

按官方提示进行获取沙箱密钥的时候&#xff0c;久试不爽&#xff0c;总是提示错误 &#xff1a;“获取沙箱密钥失败&#xff0c;确保交易密钥是否正确”。这个纯粹是微信平台挖的坑呀&#xff0c;文档没有详细的进行一些讲解&#xff0c;也没有提示需要key&#xff0c;下面来说…

linux显示磁盘使用情况命令,Linux中监控磁盘分区和使用情况的几个工具

导读在文章中将讨论Linux中可用于监视磁盘使用情况的命令行实用程序&#xff0c;提供有关总大小容量、已用总量、文件系统信息和分区信息等。让我们看看这些工具如何帮助检索这些信息df命令df是一个Linux命令行实用程序&#xff0c;用于监视Linux磁盘使用情况。df命令显示文件系…

linux网络是文件吗,linux网络配置文件是什么意思

离开了么放得下我么回来了么还会爱我么新兵答主07-22TA获得超过2383个赞网卡的配置&#xff1a;1.网卡配置文件对于网卡信息的配置通常包括&#xff1a;配置IP地址、子网掩码和网关。网卡信息保存在网卡配置文件中。网卡配置文件位于/etc/sysconfig/network-scripts目录下。一块…