本文只简单描述一些逻辑迁移的问题,而且主要是针对开发过程中,小批量数据(例如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. Roslyn 将构建时间写入到输出文件

    我期望在每次构建完成之后,创建一个文件,在这个文件里面写入是什么时间构建的.这个需求实现非常简单,只需要使用 Target 在构建完成,使用 WriteLinesToFile 方法写入时间到输出文件即 ...

  2. dotnet 修复 Uno 中文乱码

    这是一个历史问题,在使用 Uno 展示中文的时候,如果设置 Uno 的底层使用 Skia 系进行渲染,那么将会因为中文字体问题,导致渲染出现乱码.此问题已被我修复,最佳解法是更新到最新版本 在上一篇博 ...

  3. 超级好用的 HBase GUI 工具分享

    超级好用的 HBase GUI 工具分享 你是否曾为 HBase 数据管理而苦恼?别担心,这一款超级好用的 HBase GUI (HBase Assistant)工具,让您在大数据世界中游刃有余.不再 ...

  4. 数据分析之pyecharts v1版本

    维护人员,感谢他们 https://github.com/chenjiandongx https://github.com/chfw https://github.com/kinegratii中文文档 ...

  5. vue-单独引入css文件,设置公共的css样式或者修改默认的vant,mint样式

    1.css文件夹下新建global.css文件并粘贴复制: ======================= :root{     --bgColor : #d3252a;     --pinkColo ...

  6. Educational Codeforces Round 162 (Rated for Div. 2) E

    E:Link 枚举路径两端的颜色 \(k\). 令 \(g[x]\) 表示满足以下条件的点 \(y\) 数量. $ y \in subtree[x]$ \(col[y] = k\) \(y\) 到 \ ...

  7. Competition Set - 模拟赛 I

    HNOI2017 Day2 2023-06-10 注:Day2T2换为BJOI2017Day2T1,以匹配学习进度 A.大佬 B.抛硬币 C.喷式水战改 A 大佬 你需要用 \(n\) 天挑战一名大佬 ...

  8. 源码安装expect

    1. yum安装expect 如果有外网,可以yum安装,如下: yum install expect 2.源码安装expect 下载tcl源码包 cd /tmp &&wget htt ...

  9. 《Modern C++ Design》之上篇

    如下内容是在看侯捷老师翻译的<Modern C++ Design>书籍时,整理的code和摘要,用于不断地温故知新. 第一章 1. 运用 Template Template 参数实作 Po ...

  10. GCC编译选项含义解析

    GCC 编译 GCC的编译流程分为四个步骤,分别为: 预处理(Pre-Processing) 可以通过gcc -E hello.cc -o hello.i查看中间结果 编译(Compiling) 汇编 ...