本文只简单描述一些逻辑迁移的问题,而且主要是针对开发过程中,小批量数据(例如100m之下的).

这几天装了个新的mysql8.0.25 64bit windows版本的。

--

看的出来oracle公司对于mysql暂时还没有象oracle那么上心,当然oracle本身已经有将近40年历史,而mysql是最近10来年才稍微发展快一些。

在oracle下,有个非常好用的工具impdb,expdp工具。

mysql好像还没有那么好用,不过现在mysqldump已经越来越完善了,某一天也许就是和impdb,expdp差不多了。

mysqldump+mysqlimport

以前老是抱怨mysql太渣,尤其是逻辑迁移数据的时候,不过现在好了一些。

例如通过mysqldump工具+source,mysqldump+load会加快一些逻辑迁移/复制的过程。

例如通过选项

-e, --extended-insert
                      Use multiple-row INSERT syntax that include several
                      VALUES lists.
                      (Defaults to on; use --skip-extended-insert to disable.)

在8.0.25中,这是一个默认选项。具体从哪个小版本开始,这是默认打开的,不能确认。

有了这个-e的选项,可以大大加快导入的速度。

--

不过这不是最快的选项,就好比oracle下,使用sqlldr是更快的方式,mysql用的是load from命令,或者是mysqlimport

通过mysqldump的以下几个选项,可以导出为txt:

--fields-terminated-by=name
                      Fields in the output file are terminated by the given
                      string.
  --fields-enclosed-by=name
                      Fields in the output file are enclosed by the given
                      character.
  --fields-optionally-enclosed-by=name
                      Fields in the output file are optionally enclosed by the
                      given character.
  --fields-escaped-by=name
                      Fields in the output file are escaped by the given
                      character.

导出的txt,最后要导入,具体参考:https://blog.csdn.net/u012815136/article/details/88953289

也可以之际参考官方文档:

这里复制下命令下:

LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]

如果要批量迁移多个表格,现在只能编写批处理。

如果您会python,那么一个好处是可以只写一次,然后装python的环境即可,这个操作类似于java。

mysqldump+mysqlimport练习

导出txt和导入txt

导出 rap10.table_keywordvalue,txt文件中以|作为列分隔符,以·作为列的封装符,行以换行符为分割符号

mysqldump -h localhost -u root -p -P 7799 --databases rap10  --tables table_keywordvalue  --tab=d:\temp\mysql\dump --fields-terminated-by="|" --fields-enclosed-by="`" --lines-terminated-by=0x0d0a
在d:\temp\mysql\dump下生成两个文件,
sql的部分内容为:
DROP TABLE IF EXISTS `table_keywordvalue`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `table_keywordvalue` (
  `id` int NOT NULL AUTO_INCREMENT,
  `custom_id` bigint unsigned NOT NULL,
  `table_id` int NOT NULL COMMENT '自定表ID',
  `db_table_name` varchar(100) NOT NULL COMMENT '自定义表数据库名称cxxx_***格式-例如c101_students',
  `user_id` int NOT NULL COMMENT '用户ID-添加该记录的用户ID',
  `last_optime` varchar(19) DEFAULT NULL COMMENT '最近修改时间-可以是新增时间,也可以是修改时间',
  `keywordvalue` varchar(900) DEFAULT NULL COMMENT '关键字值',
  UNIQUE KEY `idx_table_keywordvalue_id` (`id`),
  KEY `idx_custom_id` (`custom_id`),
  KEY `idx_tablekeyvalue_tableid` (`table_id`)
) ENGINE=InnoDB AUTO_INCREMENT=55830 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='自动表单关键字-用于加快待办查询';

txt内容部分如下:
`241`|`264`|`117`|`C117_scores`|`1`|`2019/12/27 15:28:20`|`adfaf`
`243`|`267`|`117`|`C117_scores`|`1`|`2019/12/27 16:01:52`|`test`

编写一个脚本(my.bat)测试下:

@echo off
for /f "tokens=1-3 delims=-/ " %%1 in ("%date%") do set ddd=%%1/%%2/%%3
for /f "tokens=1-4 delims=.: " %%1 in ("%time%") do set tttt=%%1:%%2:%%3
Set DT=%ddd% %tttt%
echo 开始运行时间:%DT%
mysqlimport -h localhost -u"root" -p"123" -P 7799 --fields-terminated-by="|" --fields-enclosed-by="`" --lines-terminated-by=0x0d0a mysqldata d:\temp\mysql\dump\table_keywordvalue.txt
mysql -h localhost -u"root" -p"123" -P 7799 <check.sql
for /f "tokens=1-3 delims=-/ " %%1 in ("%date%") do set ddd=%%1/%%2/%%3
for /f "tokens=1-4 delims=.: " %%1 in ("%time%") do set tttt=%%1:%%2:%%3
Set DT=%ddd% %tttt%
echo 截止运行时间:%DT%
@echo on

其中check.sql的内容如下:

use mysqldata;
select count(*) from table_keywordvalue;
exit

注意:“exit"后必须后换行

之后,进入d:\temp\mysql\dump目录,执行my.bat,执行结果如下:

D:\temp\mysql\dump>my.bat
开始运行时间:2021/09/15 22:26:40
mysqlimport: [Warning] Using a password on the command line interface can be insecure.
mysqldata.table_keywordvalue: Records: 22782  Deleted: 0  Skipped: 0  Warnings: 0
mysql: [Warning] Using a password on the command line interface can be insecure.
count(*)
22782
截止运行时间:2021/09/15 22:26:43

---

整体运行时间大概是3~4秒钟,比执行22782条sql快了不知多少倍!

mysqlimport 参数有很多,逐一理解,大概要写小一本书。

--

mysqldump+mysqlimport 导入导出一两个大表还是不错,不过步骤比较繁琐,所以mysql也推出了类似expdp,impdp的工具:mysqlpump

比起dump+import组合,pump工具明显更加方便一些,毕竟mysqlimport要是导入许多的文件也是要写一些有点麻烦的脚本,当然这个脚本在linux下可能会好写一些。

--

mysqlpump

这个工具有点类似mysqldump,但比mysqldump好。

特点有几个:

1.并行

2.能够更好地选择要导出什么对象:库,表,账户,过程,试图

3.导出账户的时候,生成的语句是账户管理语句,而不是插入账户信息到某些系统表那样的语句

4.可以压缩输出

5.进度指示(估计的)

6.允许加载数据后,再生成辅助索引(二级索引),以加快数据加载过程

先来个导出的例子:

mysqlpump -h localhost -u"root" -p"123" -P 7799 rap10 table_keywordvalue --extended-insert=103 --compress --default-parallelism=5  --no-create-db --no-create-info --defer-table-indexes  --result-file=d:\temp\mysql\pump\p.sql
D:\temp\mysql\pump>mysqlpump -h localhost -u"root" -p"123" -P 7799 rap10 table_keywordvalue --extended-insert=103 --compress --default-parallelism=5  --no-create-db --no-create-info --defer-table-indexes  --result-file=d:\temp\mysql\pump\p.sql
mysqlpump: [Warning] Using a password on the command line interface can be insecure.
Dump progress: 0/1 tables, 103/22400 rows
Dump completed in 1849

导出过程很快,大概2~3秒。
看下结果,和Mysqldump的类似,不过烦人的是无法忽略视图。
--
-- Dump created by MySQL pump utility, version: 8.0.25, Win64 (x86_64)
-- Dump start time: Thu Sep 16 23:05:53 2021
-- Server version: 8.0.25 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET @@SESSION.SQL_LOG_BIN= 0;
SET @OLD_TIME_ZONE=@@TIME_ZONE;
SET TIME_ZONE='+00:00';
SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;
SET NAMES utf8mb4;
INSERT INTO xxxxxxxxxxx
....
...
-- 创建视图的语句
..... (具体略)
SET TIME_ZONE=@OLD_TIME_ZONE;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET SQL_MODE=@OLD_SQL_MODE;

这里有多个可以提升速度的参数,具体看环境:

compress

extended-insert

default-parallelism

还有其它一些,不过比较明显的就是上面这三个

导入数据的例子,后续有空再补充。

看了这几个工具,发现比起oracle还是有不少欠缺。oracle下有接近完美的逻辑备份恢复工具expdp,impdb,而mysql暂时还没有(至少自带的是这样)

mysql数据迁移-8.0.25的更多相关文章

  1. MySQL数据迁移那些事儿

    前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表.某个库或某个实例.根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题.本篇文章,我们一起来看下 MySQL ...

  2. mssql与mysql 数据迁移

    概要: mssql向mysql迁移的实例,所要用到的工具bcp和load data local infile. 由于订单记录的数据是存放在mssql服务器上的,而项目需求把数据迁移到mysql ser ...

  3. MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒

    这里采用.NET Framework 4.0以上版本中新出现的 ConcurrentQueue<T> 类 MSDN是这样描述的: ConcurrentQueue<T> 类是一个 ...

  4. .Net5 IdentityServer4下SqlServer和Mysql数据迁移

    1.概念 以下概念从官网整理的,我也是看官网一步一步学习的 官网地址 https://identityserver4.readthedocs.io/en/latest/index.html 1.1 I ...

  5. 记一次MySQL数据迁移到SQLServer全过程

    为什么要做迁移? 由于系统版本.数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导.开发请示,得到批准后,便有了这次学习的机会,所以特此来记 ...

  6. MySQL数据迁移到SQL Server

    数据迁移的工具有很多,基本SSMA团队已经考虑到其他数据库到SQL Server迁移的需求了,所以已经开发了相关的迁移工具来支持. 此博客主要介绍MySQL到SQL Server数据迁移的工具:SQL ...

  7. mysql 数据迁移

    最近线上系统新挂了一次磁盘,需要将系统磁盘下的 mysql 数据目录迁移到 数据盘上. 经过一番考察,mysql在安装时,使用了预编译的二进制tar.gz包.共有两处配置了 datadir属性 /et ...

  8. centos下mysql数据迁移方法

    第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...

  9. MySQL数据迁移问题

    最近尝试了一下小型数据迁移.本地迁移,windows平台,修改配置文件中的data_dir项,然后将旧的data文件下的数据文件全部拷贝过去. 之后登陆数据库,竟然1145错误.可以看到数据库的结构, ...

  10. mysql 数据迁移时遇到 外键限制

    禁用外键约束    SET FOREIGN_KEY_CHECKS=0; ......数据迁移........ 启动外键约束    SET FOREIGN_KEY_CHECKS=1;

随机推荐

  1. [Blockchain] 前后端完全去中心化的思路, IPFS 与 Ethereum Contract

    我们在使用智能合约的时候,一般是把它当成去中心.减少信任依赖的后端存在. 如果没有特殊后端功能要求,一个 DApp 只需要前端驱动 web3js 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...

  2. Django高级表单处理与验证实战

    title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: D ...

  3. Docker基础 ubuntu安装docker

    目录 如何在Linux深度系统deepin下安装docker 介绍 安装docker 在ubuntu的docker中运行ubuntu 在ubuntu的docker中运行centos 卸载docker ...

  4. [BZOJ4358]permu线段树+莫队

    先放代码 晚上补(争取) [BZOJ4358]permu 线段树+莫队做法 序列操作,多次询问,无修,标准的莫队. 在如何在不同区间内转移的问题上,我选择用线段树来维护(没听xfg讲回滚莫队不行啊) ...

  5. pageoffice在线编辑word文件并禁止选中

    一.整篇文档禁止选中 wordDoc.setDisableWindowSelection(true); //禁止word的选择文字功能 二.根据条件判断是否禁止选中 比如:选中内容超过一定字数,取消选 ...

  6. starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

    在线求解[已解决] 问题 D:\persioninto_exe\soft\jdk1.8.0_322\bin\java.exe -XX:TieredStopAtLevel=1 -noverify -Ds ...

  7. 7z 命令行压缩解压详解-中文版

    1) 简介 7z,全称7-Zip, 是一款开源软件.是目前公认的压缩比例最大的压缩解压软件. 主页:http://www.7-zip.org/ 中文主页:http://7z.sparanoid.com ...

  8. vue-cli3 项目路由 history 模式部署到 nginx 服务器

    1.项目修改vue.config.js增加 publicPath: '/' 2.nginx配置 location / {#访问前端页面 root /data/dist;#vue项目存放路径 index ...

  9. SMOGN算法Python实现:解决回归分析中的数据不平衡

      本文介绍基于Python语言中的smogn包,读取.csv格式的Excel表格文件,实现SMOGN算法,对机器学习.深度学习回归中,训练数据集不平衡的情况加以解决的具体方法.   在不平衡回归问题 ...

  10. tab切换中嵌套swiper轮播

    今天在做官网的时候需要用到swiper多图轮播的功能,但是得嵌套在tab切换中,就在我把砖都搬完后,发现了个问题,就是我在进行tab切换后,发现原本设置的swiper的自动轮播竟然失效了,而且样式也是 ...