用户指南—数据导入和导出—使用程序进行数据导入

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文将介绍如何通过编写代码的方式,将导入数据到PolarDB-X中。

假设有一操作表:


CREATE TABLE `test1` (
    `id` int(11) NOT NULL,
    `k` int(11) NOT NULL DEFAULT '0',
    `c` char(120) NOT NULL DEFAULT '',
    `pad` char(60) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    KEY `k_1` (`k`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);

从数据库中导出源数据

源数据可以用户自行生成,也可以从数据库中导出,在数据库中导出可通过mysql -e命令的方式,PolarDB-X和MySQL都支持该方式,具体方法如下:


mysql -h ip  -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM test1;" >/home/data_1000w.txt

## 原始数据以制表符分隔,数据格式:188092293 27267211 59775766593-64673028018-...-09474402685 01705051424-...-54211554755
mysql -h ip -P port -u usr -pPassword db_name -N -e "SELECT id,k,c,pad FROM test1;" | sed 's/\t/,/g' >/home/data_1000w.csv
## csv文件格式以逗号分隔,数据格式:188092293,27267211,59775766593-64673028018-...-09474402685,01705051424-...-54211554755

推荐对字符串进行处理,转变成csv文件格式,方便后续程序读取数据。

在PolarDB-X中创建目标表

源数据不包括建表语句,所以需要手动在PolarDB-X目标数据库上创建表,关于PolarDB-X建表语句的语法请参见CREATE TABLE语句,例如:


CREATE TABLE `test1` (
`id` int(11) NOT NULL,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`id`);

使用程序导入数据到PolarDB-X

您可以自行编写程序,连接PolarDB-X,然后读取本地数据,通过Batch Insert语句导入PolarDB-X中。

下面是一个简单的JAVA程序示例:


// 需要mysql-connector-java.jar, 详情界面:https://mvnrepository.com/artifact/mysql/mysql-connector-java
// 下载链接:https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar
// 注:不同版本的mysql-connector-java.jar,可能Class.forName("com.mysql.cj.jdbc.Driver")类路径不同
// 编译 javac LoadData.java
// 运行 java -cp .:mysql-connector-java-8.0.20.jar LoadData
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class LoadData {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
File dataFile = new File("/home/data_1000w.csv");
String sql = "insert into test1(id, k, c, pad) values(?, ?, ?, ?)";
int batchSize = 1000;
try (
Connection connection = getConnection("ip", 3306, "db", "usr", "password");
BufferedReader br = new BufferedReader(new FileReader(dataFile))) {
String line;
PreparedStatement st = connection.prepareStatement(sql);
long startTime = System.currentTimeMillis();
int batchCount = 0;
while ((line = br.readLine()) != null) {
String[] data = line.split(",");
st.setInt(1, Integer.valueOf(data[0]));
st.setInt(2, Integer.valueOf(data[1]));
st.setObject(3, data[2]);
st.setObject(4, data[3]);
st.addBatch();
if (++batchCount % batchSize == 0) {
st.executeBatch();
System.out.println(String.format("insert %d records", batchCount));
}
}
if (batchCount % batchSize != 0) {
st.executeBatch();
}
long cost = System.currentTimeMillis() - startTime;
System.out.println(String.format("Take %d second,insert %d records, tps %d", cost/1000, batchCount, batchCount/(cost/1000)));
}
}
/**
* 获取数据库连接
*
* @param host 数据库地址
* @param port 端口
* @param database 数据库名称
* @param username 用户名
* @param password 密码
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
private static Connection getConnection(String host, int port, String database, String username, String password)
throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = String.format(
"jdbc:mysql://%s:%d/%s?autoReconnect=true&socketTimeout=600000&rewriteBatchedStatements=true", host, port,
database);
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
}

您可以根据实际应用场景编写程序,设置合适的batch size和多线程导入,能够加快性能。

相关文章
|
12月前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
540 4
|
7月前
|
Java
【Azure Application Insights】配置 JMX 指标无法收集到参数的情况
在使用 Application Insights Java 3.x 收集 JMX 指标时,若无法收集到数据且程序无报错,通常是由于不同 Java 版本中 JMX 的属性名称不同所致。确保配置正确的 `name` 和 `attribute` 值至关重要。对于 GC 相关指标,建议参考特定配置,并使用 JMXTerm 工具查看当前环境中的 JMX 指标值,以确认属性名称的准确性。详细配置和解决方法可参见官方文档及 troubleshooting 指南。
|
前端开发 Java Linux
性能工具之 Jmeter 通过 SpringBoot 工程启动
【5月更文挑战第22天】性能工具之 Jmeter 通过 SpringBoot 工程启动
336 8
性能工具之 Jmeter 通过 SpringBoot 工程启动
Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3
Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3
|
人工智能 算法 Java
我整理了50道经典Java算法题,直接进了字节跳动!!
最近,很多小伙伴都想进入字节跳动这个快速发展的公司,而字节跳动对于算法的要求比较高。于是乎,有些小伙伴问我能否整理一些基础的算法题,帮助他们提升下基础算法能力。我:没问题啊!于是,经过半个多月的收集和整理,最终输出了这50道经典的Java算法题。
5200 0
|
算法 定位技术
无线定位中TDOA时延估计算法matlab仿真
无线定位中TDOA时延估计算法matlab仿真
使用 fdisk 对分区进行扩容
使用 fdisk 对分区进行扩容
273 0
|
缓存 JavaScript 前端开发
LayUI系列(三)之动态添加选项卡
LayUI系列(三)之动态添加选项卡
|
SQL Java Shell
Apache Oozie- 实战操作一串联任务调度(依赖关系)|学习笔记
快速学习 Apache Oozie- 实战操作一串联任务调度(依赖关系),在实际工作中,可能会存在很多任务模块,这些模块都会存在一定的关系,比如说一件事大概有 ABC 三个模块,在 A 得出的结果作为结果输入,A 传出 B,B 再作为结果传出 C,这样就形成了一个串联任务,在 oozie 当中,配置多个 action, 可以实现多个任务之间的相互依赖关系。 比如说一个简单需求,首先执行一个 shell 程序,shell 执行完之后再执行 MR 程序,最后执行 hive 程序,三者之间形成一个首尾相连的串联,看一下具体怎么操作。
Apache Oozie- 实战操作一串联任务调度(依赖关系)|学习笔记
|
XML Java 数据格式
80.【Spring5】(三)
80.【Spring5】
115 0