PolarDB-X 数据导入导出 | 学习笔记

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 快速学习 PolarDB-X 数据导入导出

开发者学堂课程【PolarDB-X开源分布式数据库进阶课程PolarDB-X数据导入导出】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/1202/detail/18328


PolarDB-X数据导入导出


内容介绍:

一、PolarDB-X 简介

二、导入导出介绍

三、演示内容

四、总结


一、PolarDB-X 简介

1、PolarDB-X 架构

主要分为四个部分:元数据服务(GMS)、存储节点(DN )、计算节点(CN)、日志节点(CDC)。元数据服务主要是存储元数据的一些信息。存储节点用于存储一些数据,基于 Paxos 的多节点集群。日志节点主要是兼容 MySQL 的 binlog 协议。

image.png

2、课程介绍

上一讲已经讲过了开源训练,这次是进阶的,感兴趣的也可以去参加上一次的七个课程。

image.png

最近 PolarDB-X 开源了 V2.2 版本,包含了以下特性。

image.png

开源的配套工具这边有一个 Batch Tool 工具,也就是 PolarDB-X 团队自主研发的一个新的专门为分布式数据库打造的导入导出工具,它可支持多线程,目前也已经开源了,也是和这节课程相关。

课程资源如下图

image.png


二、导入导出介绍

1、PolarDB-X 的数据导入导出方式

导出方式有:mysql-e 命令行导出数据、mysqldump 工具导出数据、Select into outfile 语句导出数据(默认关闭)、Batch Tool 工具导出数据。

Select into outfile 语句导出数据默认是关闭的,因为在向公有云,它由于是 CN 式不可访问的,用户连接不上,执行时直接存储到 CN 计算节点上而不是 MySQL cline 连接端上。Batch Tool 工具就是我们开发的一套导入导出工具。

导入方式有:Source 语句导入数据、mysql 命令导入数据、程序导入数据、Load data 语句导入数、Batch Tool 工具导入数据。Source 语句也是 Mysql 的一个语法,Mysql 命令也能够导入数据。程序导入数据就比较好理解,像 jawl 通过 GDVC来连接上数据库,再拼凑成 insert 语句来执行,这也算一种导入数据的方式。Load data 语句也是 Mysql 语法中的一种。


三、演示内容

1、PolarDB-X 导入导出 Demo 1

纯数据格式导入导出

从PolarDB-X 导出后是一个单纯的数据组成的文件,不包含表的一些信息,例如 Mysql-e 命令行执行导出的就是数据文件。像 Select into outfile 语句导入的话可以通过 Load data 语句和程序导入 PolarDB-X。而且开发的 Batch Tool 也是这种纯数据格式的导入方式。

image.png

打开云企实验室,因为部署课程上节课已经讲过,今天的课程就有一点点区别。创建资源后,镜像环境已经安装好了第三方包,所以只要直接切换到 Docker 或直接切换到另一个用户,因为 root 用户无法启动 minikube 。然后启动一个 minikube ,跟上节课程相同,然后再通过X Operator 创建一个 PolarDB-X。不同的是,部署 PlarDB-X 集群的 yaml 文件,部署参数可以在官网上详细查看。如果没有指定镜像地址的话,他就会拉取一个最新的镜像地址。为了操作方便,这里也增加了一个参数,设置了 PolarDB-X root 用户的密码。如果没有显示指定的值,他就会为 PolarDB-X root 用户随机生成一个字符串的密码。由于部署时间过长,这里直接部署好了,可以查看一下节点的状态。我们会为每一个 polard打上一个 CDC 节点,CDC 也是一个计算节点,DN 也就是一个存储节点,GMS 也就是元数据节点。也可以通过 kubectl get pxc 来看它是否是 running 状态。如果不知道密码,也可以通过 secret 去查看。

因为这里显示了一个比较简单的“123456”,所以直接连接就可以。因为我们是通过 minikube 创建了一个小型的,类似单机的 k8s ,k8s 的网络有些不同,就是本地需要一个转发才能执行。把k8s的端口映射到3306端口上,这样就可以连接了,但是必须保证终端窗口运行才能够持续转发,所以我们可以点一个“+”来创建新的终端来连接数据库。

image.png

这就和普通的 Mysql 一样执行,和 Mysql 的体验是一样的。需要说明的一点是,我们刚刚切换到 galaxykube 用户,所以说 k8s 的操作即 kubectl 命令都需要在 galaxykube 用户下才可进行。而其他的像是登录数据库和其他执行命令可在 root 或galaxykube 用户下进行操作,因为这次试验会涉及到一些数据库的操作和一些命令的操作,我们推荐分屏的方式进行操作。

首先就是安装 sysbench,准备一些初始数据。因为我们提前登录了数据库,所以我们可以直接在这边创建一个库,再通过 sysbench 导入到数据库中。sysbench 是一个测试数据库的常见工具,它包括一些不同的负载,这里选择了一个比较简单的 insert ,因为我们只要准备初始数据,然后后面就是一个连接 Mysql 的连接串,因为 PolarDB-X 也是进入 Mysql ,所以说,这些连接串都是一样的,然后 MysqlDB 也就是刚刚创建了 sysbench,然后DB 就是数据库的类型就是 mysql ,table=1 就是创建了一个表。

table-size=100000 就是他会创建一个100000行的初始数据,然后我们可以让他运行一下。

image.png

由于我们这个工具没有加一些创建表的工具,所以它默认创建的表是一个单表,因为我创建的这个库下面是一个分库分表的规则的库,也就是以前的 didx 。在 polarDB-X2.0 中有库,就会直接和 Mysql 的体验是一样的。

它会自动生成一个分库分标规则,更多详细的可以看官网。所以,我们更希望通过分库分表,也就是分布式数据库中比较常见的一个表。所以说,需要把一个单表更改一下,手动创建一个分库分表。分库分表的规则就通过组件来拆分。然后可以通过 insert 数据把它刚才导入的一张表当中把它 insert 到我们需要的一张表当中。因为这是一个比较小型的 k8s ,所以说,资源上面可能分配的也并不是很多,所以说,性能也不用考虑,更多的是考虑它的正确性。我们可以看一下这张表里的数据还有一些建表的信息,可以看到它是一个分库分表,这张表的组件的最小值是1,最大值是100000,总共的行数也是100000行。也可以看一下这张表中的数据,就是一个比较典型的 sysbench 创建的一个表的构造成的数据,ID 是组件,k 也是一个 int 类型,c和 pad 都是字符串,它是拼成的一个字符串。现在的话,初始数据就准备好了,在 sysbench-int 里面。我们就可以通过命令来进行导入,可以来看一下下面这个命令

image.png

这个 time 就可以记录执行这条命令的后面一个命令所花的时间,然后,mysql 就是连接上 mysql,sysbench-int 是一个库名,-n主要是为了不让后面的执行会输出一个列名,-e就是执行这么一个 SQL,就是四个列,然后从这个sbtest1table当中把它存储到本地的一个文件里面,就date_10w。

可以在目录上看到这个文件。这个文件的大小10w行,99MB。我们也可以看一下他导出的文件是什么样子的。它的数据结构和这个表的数据是一样的,不过它默认是通过字表符来分割开。我们也可以统一一下它刚好是一行数据就是一行,所以说可以统计一下这个文件里面有多少行数据,就是100000行,和这个表的数据是一致的。像比较常用的 CSV 文件,可以简单通过一个字符串处理替换把它的字表符改成“,”,也可以导出。我们也可以看一下 csv 文件的数据格式,就是把分隔符从原来的字表符改成了逗号。还有一种 select into outfile 是默认关闭的,因为操作起来比较麻烦,这里是没有写的。但是我们也可以操作一下,就是一个可选的操作。首先先切换到一个 galaxykube 用户下面,然后才能进行 k8s 操作,我们可以登录到 CN 的节点里面。

可以看到目前目录下是没有文件的,可以通过一个 select 语句,通过一个 hint 把这个功能打开,把这个文件直接 select 出来,存到点 tst 文件下面。我们也可以看一下现在的文件。他因为是会存储到 CN 节点,所以说,像公有云上面是默认关闭的。也可以看一下他的数据,也是默认字表符分隔,行数也是10w行。

这就是一个纯数据格式的导出。回到 root 下面,就来进行一个导入了。纯数据格式比较常见的是 load data 语句,由于 load data 语句需要一个参数,所以登录时需要加上一个 localinfile 参数,才能执行 loaddata 语句。登录上去后,先创建一个目标的库表。我们就把它创建到 test 1 库表里面,再创建一个和初始的表一样的结构的表,也是包含一个分库分表规则,也是数据库比较常见的一个表。然后导入到目标表中,loaddata 是单项能导入,所以它的性能会慢一点,目前配置资源也不是很高,所以我们可以登录到数据库看一下它的情况。这里也可以查看一下他目前导入了多少数据。可以看一下它的数据,和原来的表基本是对的上的。

image.png

程序导入,在 PolarDB-X 阿里云官网上也有一个例子,这里就不再演示了。就是通过一个java 程序将 sc 文件读出每一行的数据,然后在拼成到 insert 表当中,就可以完成。

2、PolarDB-X 导入导出 Demo 2

SQL 语句格式导入导出

image.png

从 PolarDB-X 导出的数据是 SQL 的形式,比较典型的是 mysqldump 工具,从mysqldump 工具导出的会帮你拼成一条条建表语句之类的,就需要数据库兼容 SQL 语句的格式。

SQL 语句导入的话,像 source 语句就是 mysql 提供的, mysql 命令这种方式也可以导入一些 SQL 语句,mysql 命令就可以执行这一 SQL 语句。Time 也是只记录执行后面的命令所需要的时间。Mysqldump 是 mysqldump 命令的一个工具。后面就是 mysql 的连接串,还有一些参数设置字符格式。比较特殊的是 ,它就是会拼成一条insert 语句的长度。这里设置成10k,就不需要库的语句,就不需要输入一些信息。目标的库是 sysbench-int ,目标表是 sbtest1,把它导入到一个 dumpsql 文件里面,可以看一下大小基本对的上。可以看一下前面的数据,可以看到他就是会设置成一些 SQL 语句,比如这些参数,把他拼成一个 insert into 到一张表的,后面会加上一连串的行的数据。Benchsize 的大小是一行一行的 insert into,由 net8from 长度来决定的。把它导入到 test two 库上面,因为指定了表名,所以必须创建一张新的表,和原来的表是一样的。然后执行 Source 命令,需要注意一下文件路径,因为是在 root 用户下面,所以是没有行数,这里是 insert,可以看到是它的 benchsize 是51,就是拼成了51一行就是一个语句。可以登录数据库查看这张表的数据,这种方式会快一些,因为有 benchsize,也是要分级别的一个导入。这就是 X-operate 的特性,检测到 dn 由于其他原因无法运行,会直接拉起。如果端口断联需要重新发送。从命令行导入就不用 source 语句了,就直接一个连接串,把cycle语句导入进去就会连上去执行了。这种 SQL 语句的格式方法就类似于执行 SQL 文件的一行一行的 SQL ,执行过程也是单线程一行一行的去执行,所以耗时会慢一些。因为内存比较小,执行过程可能会出现一些一些内存不够的情况。

3、PolarDB-X导入导出 Demo 3

Batch-Tool工具导入导出

image.png

Batch Tool 已经开源了,开源地址在 galaxysql-tools 下面可以看到,Batch Tool 工具也是通过数据文件的格式来导入导出。因为云企实验室的问题,从 gitiub 下载太慢,所以采用 oss 下载,因为是一个 java 的包,所以需要安装一下 java 的环境。 J#java-jar就是执行这个 java 包,就是一个比较常见的 mysql 连接串,-D 是指定数据库,-o 是类型,export 就是导出它还可以导入,-t 就是表名,-s 就是分隔符,-f 就是文件个数,因为它支持根据分库分表规则来导出不同的文件,开始连接。

导出一般是比较快的,可以看到它默认导出 sbtest.1-0,就是第一个文件上面。可以看一下它的数据,因为我们指定了逗号来分割,每行数据他就直接是逗号分隔。数据行数是10w行,我们把它导入到 test-1表中,先把表里的数据清空一下,然后再执行导入。导入也是需要连接串指定的数据库,tap是导入,-t 是表名,分隔符也可以指定,maxConn 就是一个连接串,就是一个并行度,可以看到前面几种方式都是单线程,他是比较慢,而 benchtool 是多线程,他现在读取,然后执行。一般三四十秒就可以执行完,比原来的快,就是得益于多线程的执行。数据也对的上,最小值,最大值,还有行数。

4、PolarDB-X 导入导出 Demo 4

PolarDB-X 和 Mysql 数据迁移

image.png

因为 PolarDB-X 是兼容 Mysql 生态的,所以是支持的。我们更推荐的是通过数据文件从导入到导出一个数据再去导入导出到 Mysql。不推荐 SQL 语句格式,因为 PolarDB-X 是分布式数据库,包含一些特有分布式数据分片规则,希望是通过手动来建表建库之类的。云企实验室是并没有的,演示的话可以手动,但操作会麻烦一点,这个是可选的一个功能。

首先是部署一个 mysql 库,通过 k8s 部署 mysql 这种任务方式网上可以查询。这里提前准备了一下 yaml 文件。

image.png

然后它的 service 网络

image.png

然后就需要部署一下,这些就是 k8s 比较常见的命令,他现在就在创建。可以看见 yaml 文件上面设置了一个密码,然后它的配置也比较低,因为资源有限。因为k8s的原因,也是需要一个 insert。这里因为 PolarDB-X 端口 insert 到3306,所以这里就把他 insert 到3307。可以试一下登录,这里也会报一个错,因为密码的原因。因为 mysql8.0 驱动改了一个 caching-sha2-password 的一个验证,所以说这个问题网络上也可以百度的到。就可能需要进行一些操作,我们需要登录 inport 里面,里面是可以登录的,然后把密码类型改成 mysql。

然后可以从 inport 退出,现在就可以登录。可以看一下它的 version 就是比较原生的 mysql8.0.31版本。为了让它持续转发,可以新加一个端口。首先从 mysql上建一个库,然后创建一个单表,和 sysbench 的表的结构是一样的。因为我们从目录下已经把 PolarDB-X 的数据导出,我们现在就把 PolarDB-X 导出的数据导入到 Mysql 当中,需要注意的是,他因为拉起一个 Mysql 它默认是把 look into outfiles 是关闭的,就无法使用 LoadData 语句,所以说我们要把它打开,打开之后就可以使用 Loaddata 语句。可以看一下从 polar-x 导出的一个文件, data-10w 的 TST 文件已经成功导入到Mysql 当中,我们再把 Mysql 语句中导出出来。这条命令也就通过字符串的方式执行。把它导成一个 csb 文件。这个是 mysql 导出的数据,我们现在把它导入到 PolarDB-X 当中。首先把刚才导入的数据清除,这个就是刚才 Polar-X 的账号,我们通过 benchtool 来导入更快一下。

我们就把他导入到 test-1 这张表上,并行度也一样,并行度高,可以选择关闭。因为配置过低,我们可以换一种方式。可以看一下从 Mysql 导出的数据,也是通过逗号分隔的普通 csv 文件格式,和 PolarDB-X 的导出的数据是一样的,所以基本上是可以互通导入导出的。

前面讲的都是基本上是有一个中间状态的文件,类似于有个中间数据,PolarDB-X还可以通过 CDC 节点和 Mysql 同步,就没有中间数据这么一个中间态了。

而 CDC 节点就是能把多个 DN 的 Binlog 汇聚起来,变成一个全局统一的 Binlog,就是完全进入 Mysql 的 Binlog 格式,还有 Mysql 的 Replication 协议,想了解的话可以去看第一期的开源训练营的《如何将 PolarDB-X 与大数据等系统互通》。

image.png

四、总结

1、Batch-Tool原理

因为采用多线程操作、使用 PreparedStatement 的批量插入和结合 sharding 规则,提高执行效率。第一个是多线程操作,首先是文件的读取,它通过一个多线程去 Ring Buffer 形成一个三态有效的模型,能够加速。执行时,类似消费时,也可以通过多线程的去执行。第二个是可以使用 PreparedStatement 的批量插入。第三个是我们可以开发一些特性,比如结合 sharding 规则,就是分库分表规则来提高执行效率。

image.png

2、Batch-Tool新特性

因为 Batch-Tool 已经开源了,也发布了新的版本,它也可以支持一个流式的压缩和导入导出,它还可以支持加密导出、解密导入,目前支持一些数据格式的文件,如果参数要配置得比较多的话,也可以在 yaml 文件中配置、读取。

image.png

3、详细性能对比

《PolarDB-X 如何优化数据导入导出》、《PolarDB-X CDC 之数据导入综述》、《PolarDB-X 如何优化 Bantch Insert》。

对 Poar-X感兴趣的话,也可以在云企实验室部署好之后也可以体验一下和 Mysql 一样的执行方式,像其他的执行不一定局限于导入导出。或者有别的想法也可以在云企实验室操作体验。因为单节点配置低,问题就会多一点。

Mysqldump 工具刚刚演示了,mysqlinport 这类暂时还未试用,如果需要这些兼容性的,也可以支持一下。一般来说,我们还未试用。因为这些工具本质就是 SQL语句的执行,就比如在 PolarDB-X 导入导出 Demo2 演示过程中,都是使用 SQL 语句的。使用 mysqldump 工具导出的 SQL 语句的一个文件,通过 Source 语句或 Mysql 命令都可以导入。

Mysql inport 也只是把 SQL 语句应用到 PolarDB-X 或者 mysql 当中。主要是这几类工具对SQL语句格式,对其他分布式数据库而言,它包含一些特殊的语法,还有一些新的特性,扩展会多一点。一般是推荐数据文件的方式导入导出。

如果要导入到其他的生态中,阿里云也有一款 DTS 的产品,它可以通过 mysql 数据的生态数据库传输到其他的产品上面,比如 Oracle、DB2 等。这也是支持的。

image.png

其他数据库导出的文件,要看你导出的是什么格式的,比较通俗的说,我们这边简单的分了下类,数据文件就是只包含了一张表中的列的数据,像刚才演示的时候也可以在云企实验室看到一个数据文件,每一行的数据通过一个分割把它分隔开。如果导出的是 SQL 语句的格式,可以看一下刚刚导出的 SQL 语句的格式,本质上它就是帮你拼好了一个 SQL,不同数据库当中可能有差异,有的是兼容,有的是不兼容。所以说,它取决于对 SQL 的支持度。

比如像 PG 它有些不同的语法,肯定是不行的。它需要数据格式的这种文件的转换传输,相当于划了个大类。我们也是比较推荐通过数据格式来导入导出,就是表结构,还有一些基本语法基本是可以兼容。如果是从产品、用户方便的角度,阿里云官网上面也有 DTS 产品可以支持不同生态的数据库的传输。

因为这里演示的是兼容 MySQL 的语法,所以 mysqldump 是可以的,Mysqldump 导出的建表都是支持的,然后 insert 是兼容 mysql 生态的,所以是可以的。演示的时候也演示了从 SQL 语句格式上面进行导入导出。从mysqldump中导出出来,再通过 Source,或者直接执行这种命令的方式,把他直接传输到 PolarDB-X。导出的文件可以看一下,比较好理解。如果没有加建表语句,直接就会拼成 inser select,这里有一些注释,可能是标识。它本质上是一条条 SQL 连接到数据库上面,然后去执行。只要是 mysql 生态都可以支持。文件的字符编码格式最好是要和 PolarDB-X 数据库的格式是一致。通过一个 Mysqldump 命令是可以指定的。这里有一个 defot 字符集,这个其实是我们兼容 mysql 的一部分,当然还有不兼容。详细的字符支持可以看我们的官方文档,PolarDB-X 支持的字符集基本都会支持。也可以登录到 PolarDB-X 去看一下它的支持的字符集,就类似于原生的 mysql 一样执行。

image.png

可以看一下建表,像 mysql 字符集是都是和 mysql 兼容的。本质上我们存储用的还是Mysql那一套。

相关实践学习
Polardb-x 弹性伸缩实验
本实验主要介绍如何对PolarDB-X进行手动收缩扩容,了解PolarDB-X 中各个节点的含义,以及如何对不同配置的PolarDB-x 进行压测。
相关文章
|
10月前
|
SQL Kubernetes 关系型数据库
实践教程之如何使用PolarDB-X进行数据导入导出
PolarDB-X 为了方便用户体验,提供了免费的实验环境,您可以在实验环境里体验 PolarDB-X 的安装部署和各种内核特性。除了免费的实验,PolarDB-X 也提供免费的视频课程,手把手教你玩转 PolarDB-X 分布式数据库。本期实验将指导您如何使用PolarDB-X进行数据导入导出。
|
11月前
|
存储 Kubernetes Java
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(1)
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(1)
180 0
|
11月前
|
存储 SQL 关系型数据库
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(2)
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(2)
161 0
|
11月前
|
SQL 关系型数据库 MySQL
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(3)
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(3)
141 0
|
11月前
|
Java 分布式数据库 数据库
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(4)
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(4)
139 0
|
11月前
|
SQL Kubernetes 关系型数据库
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(5)
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(5)
152 0
|
11月前
|
关系型数据库 MySQL 分布式数据库
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(6)
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(6)
181 0
《PolarDB-X开源分布式数据库实战进阶》——PolarDB-X数据导入导出(6)
|
7月前
|
SQL Oracle 关系型数据库
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
692 0
|
存储 SQL 安全
PolarDB-X内核新版本:将MySQL进行到底
在PolarDB-X最新的内核版本5.4.15中,提供诸多新功能:存储过程,读写分离优化,表级分区管理,密码、审计优化等。
355 0
PolarDB-X内核新版本:将MySQL进行到底
|
存储 SQL Cloud Native
PolarDB-X内核新版本:更精细的数据管理
非常高兴为大家带来PolarDB-X内核5.4.14版本。在最新版本中提供了冷热数据存储分离、数据Locality、数据热点诊断、并行DML优化、Flashback Query和AUTO_INCREMENT兼容性,大幅提升了数据的可管理性、SQL处理能力和兼容性,并针对数据热点问题为用户提供了更多运维手段。