-
1.mysql迁移到gaussdb,有没有专门的语法映射表 2.能不能调整参数在语句改变较少的情况下适配mysql的语法
-
尽量使用timestamp,空间效率高于datetime,用整数保存时间戳通常不方便处理。如果需要存储微妙,可以使用bigint存储。看到这里,这道真题是不是就比较容易回答了。
-
把不重复的数据存储为一个预定义的集合。有时可以使用ENUM代替常用的字符串类型。ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。ENUM在内部存储时,其实存的是整数。尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。排序是按照内部存储的整数
-
包括VARCHAR、CHAR、TEXT、BLOBVARCHAR用于存储可变长字符串,它比定长类型更节省空间。VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。VARCHAR存储的内容超出设置的长度时,内容会被截断。CHAR是定长的,根据定义的字符串长度分配足够的空间。CHAR会根据需要使用空格进行填充方便比较。CHAR适合存储很短的字符串,或者所有值都接近同一个长度。CHAR存储的内容超出设置的长度时,内容同样会被截断。
-
整数类型,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性,表示数据是无符号的,即非负整数。长度:整数类型可以被指定长度,例如:INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数,而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。
-
分类 类型名称 说明整数类型 tinyInt 很小的整数(8位二进制)smallint 小的整数(16位二进制)mediumint 中等大小的整数(24位二进制)int(integer) 普通大小的整数(32位二进制)小数类型 float 单精度浮点数double 双精度浮点数decimal(m,d) 压缩严格的定点数日期类型 year YYYY 1901~2155time HH:MM:SS -838:59:59~838:59:59date YYYY-MM-DD 1000-01-01~9999-12-3datetime YYYY-MM-DD HH:MM:SS 1000-01-0100:00:00~ 9999-12-31 23:59:59timestamp YYYY-MM-DD HH:MM:SS 1970010100:00:01 UTC~2038-01-19 03:14:07UTC文本、二进制类型 CHAR(M) M为0~255之间的整数VARCHAR(M) M为0~65535之间的整数TINYBLOB 允许长度0~255字节BLOB 允许长度0~65535字节MEDIUMBLOB 允许长度0~167772150字节LONGBLOB 允许长度0~4294967295字节TINYTEXT 允许长度0~255字节TEXT 允许长度0~65535字节MEDIUMTEXT 允许长度0~167772150字节LONGTEXT 允许长度0~4294967295字节VARBINARY(M) 允许长度0~M个字节的变长字节字符串BINARY(M) 允许长度0~M个字节的定长字节字符串
-
mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
-
row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
-
statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。
-
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。db权限表:记录各个帐号在各个数据库上的操作权限。table_priv权限表:记录数据表级的操作权限。columns_priv权限表:记录数据列级的操作权限。host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
-
【功能模块】loader无法连接MySQL【操作步骤&问题现象】项目上打算使用loader将hive中的数据导出到MySQL中,已经根据官方手册将jar包上传到loader主备节点指定目录,同时重启了loader,在loader的web页面进行下列操作提示错误如下查看loader运行日志,有如下报错随后使用管理员登录manager,对该用户进行授权修改好后,重新测试MySQL数据库连接,仍然不可用,请问还有什么地方没有配置吗?MRS版本:8.0.2MySQL版本:8.0.23MySQL驱动包:mysql-connector-java-5.1.34.jar【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
项目上打算使用loader将hive中的数据导出到MySQL中,已经根据官方手册将jar包上传到loader主备节点指定目录,同时重启了loader,在loader的web页面进行下列操作提示错误如下查看loader运行日志,有如下报错随后使用管理员登录manager,对该用户进行授权修改好后,重新测试MySQL数据库连接,仍然不可用,请问还有什么地方没有配置吗?MRS版本:8.0.2MySQL版本:8.0.23MySQL驱动包:mysql-connector-java-5.1.34.jar
-
1)应用方面:MySQL是中小型应用的数据库,一般用于个人项目或中小型网站及论坛。Oracle属于大型数据库,一般在具有相当规模的企业应用。2)自动增长的数据类型方面:MySQL有自动增长的数据类型。Oracle没有自动增长的数据类型,需要建立一个自增序列3)group by用法:MySQL中group by在select语句中可以随意使用,但是在Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的或者是group by子句中的列,否则报错4)引号方面:MySQL中可以用单引号、双引号包起字符串,Oracle中只可以用单引号包起字符串
-
#### 普通迁移 1、创建一个gbk字符集的表 ``` create table t_gbk ( val varchar(32) ) default character set gbk ``` 2、插入一条数据 ``` mysql> insert into t_gbk values('华为云'); Query OK, 1 row affected (0.02 sec) mysql> select * from t_gbk; +--------+ | val | +--------+ | 华为云 | +--------+ ``` 3、创建一个utf8字符集的表 ``` create table t_utf8 ( val varchar(32) ) default character set utf8 ``` 4、我们用java来迁移这张表 ``` String srcSql = "SELECT * from t_gbk"; String dstSql = "INSERT INTO t_utf8 values (?)"; try (Connection srcConn = getConn(srcUrl, srcUser, srcPwd)) { try (Statement srcStat = srcConn.createStatement()) { try (ResultSet rs = srcStat.executeQuery(srcSql)) { try (Connection dstConn = getConn(dstUrl, dstUser, dstPwd)) { while (rs.next()) { try (PreparedStatement dstPs = dstConn.prepareStatement(dstSql)){ dstPs.setString(1, rs.getString(1)); dstPs.executeUpdate(); } } } } } } ``` 5、我们来查询 ``` mysql> select * from t_utf8; +--------+ | val | +--------+ | 华为云 | +--------+ ``` 可见数据完整迁移过去了 #### 大字段迁移 有时候当客户使用的是longtext字段的时候,因为longtext的长度可以达到几百M,这个时候 1、创建一张表 ``` create table t_gbk_long ( val longtext ) default character set gbk; ``` 2、用jdbc插入一个大字段(运行这段代码需要开启6G内存) ``` String initSql = "INSERT INTO t_gbk_long values (?)"; StringBuilder sb = new StringBuilder(); for (int i=0; i(124); i++) { sb.append("华为云"); } try (Connection initConn = getConn(srcUrl, srcUser, srcPwd)) { try (PreparedStatement initPs = initConn.prepareStatement(initSql)){ initPs.setString(1, sb.toString()); initPs.executeUpdate(); } } ``` 通过SQL再插入一条更大的 ``` mysql> insert into t_gbk_long select concat(val,val,val,val,val) from t_gbk_long; Query OK, 1 row affected (14.44 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select length(val) from t_gbk_long; +-------------+ | length(val) | +-------------+ | 100663296 | | 503316480 | +-------------+ ``` 3、目标端创建一个表 ``` create table t_gbk_long_1 ( val longtext ) default character set gbk; ``` 4、jdbc迁移String ``` String srcSql = "SELECT * from t_gbk_long"; String dstSql = "INSERT INTO t_gbk_long_2 values (?)"; try (Connection srcConn = getConn(srcUrl, srcUser, srcPwd)) { try (Statement srcStat = srcConn.createStatement()) { try (ResultSet rs = srcStat.executeQuery(srcSql)) { try (Connection dstConn = getConn(dstUrl, dstUser, dstPwd)) { while (rs.next()) { try (PreparedStatement dstPs = dstConn.prepareStatement(dstSql)){ dstPs.setString(1, rs.getString(1)); dstPs.executeUpdate(); } } } } } } ``` 3G内存,结果OOM了 ``` Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:149) at java.lang.StringCoding.decode(StringCoding.java:193) at java.lang.String.(String.java:426) at com.mysql.cj.util.StringUtils.toString(StringUtils.java:1695) at com.mysql.cj.result.StringValueFactory.createFromBytes(StringValueFactory.java:129) at com.mysql.cj.result.StringValueFactory.createFromBytes(StringValueFactory.java:48) at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeByteArray(MysqlTextValueDecoder.java:134) at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:133) at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:241) at com.mysql.cj.protocol.a.result.TextBufferRow.getValue(TextBufferRow.java:132) at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:839) ``` 需要把内存调到4G才行 如果我们用byte进行读写,则可以2.5G内存就可以了 5、jdbc迁移bytes ``` String srcSql = "SELECT * from t_gbk_long"; String dstSql = "INSERT INTO t_gbk_long_2 values (?)"; try (Connection srcConn = getConn(srcUrl, srcUser, srcPwd)) { try (Statement srcStat = srcConn.createStatement()) { try (ResultSet rs = srcStat.executeQuery(srcSql)) { try (Connection dstConn = getConn(dstUrl, dstUser, dstPwd)) { while (rs.next()) { try (PreparedStatement dstPs = dstConn.prepareStatement(dstSql)){ dstPs.setBinaryStream(1, new ByteArrayInputStream(rs.getBytes(1))); dstPs.executeUpdate(); } } } } } } ``` 这里面t_gbk_long_2与t_gbk_long表结构一致,字符集也一致,此时相同字符集的bytes一致,因此不会有问题,那么如果字符集不一致会是什么样的呢 6、建表 ``` create table t_utf8_long ( val longtext ) default character set utf8; ``` 7、jdbc迁移bytes ``` String srcSql = "SELECT * from t_gbk_long"; String dstSql = "INSERT INTO t_utf8_long values (?)"; try (Connection srcConn = getConn(srcUrl, srcUser, srcPwd)) { try (Statement srcStat = srcConn.createStatement()) { try (ResultSet rs = srcStat.executeQuery(srcSql)) { try (Connection dstConn = getConn(dstUrl, dstUser, dstPwd)) { while (rs.next()) { try (PreparedStatement dstPs = dstConn.prepareStatement(dstSql)){ dstPs.setBinaryStream(1, new ByteArrayInputStream(rs.getBytes(1))); dstPs.executeUpdate(); } } } } } } ``` 结果: ``` Exception in thread "main" java.sql.SQLException: Incorrect string value: '\xBB\xAA\xCE\xAA\xD4\xC6...' for column 'val' at row 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347) ``` 可见不同的字符集的数据不能用byte做迁移,我们发现mysql有一个convert函数,它可以对不同字符集进行转换 8、利用convert进行处理 ``` String srcSql = "SELECT * from t_gbk_long"; String dstSql = "INSERT INTO t_utf8_long values (convert(? using gbk))"; try (Connection srcConn = getConn(srcUrl, srcUser, srcPwd)) { try (Statement srcStat = srcConn.createStatement()) { try (ResultSet rs = srcStat.executeQuery(srcSql)) { try (Connection dstConn = getConn(dstUrl, dstUser, dstPwd)) { while (rs.next()) { try (PreparedStatement dstPs = dstConn.prepareStatement(dstSql)){ dstPs.setBinaryStream(1, new ByteArrayInputStream(rs.getBytes(1))); dstPs.executeUpdate(); } } } } } } ``` 看有一些文章写到,读取大字段用clob或者stream来读取,我们可以试一下 9、使用CLOB ``` String srcSql = "SELECT * from t_gbk_long"; String dstSql = "INSERT INTO t_utf8_long values (?)"; try (Connection srcConn = getConn(srcUrl, srcUser, srcPwd)) { try (Statement srcStat = srcConn.createStatement()) { try (ResultSet rs = srcStat.executeQuery(srcSql)) { try (Connection dstConn = getConn(dstUrl, dstUser, dstPwd)) { while (rs.next()) { Clob clob = rs.getClob(1); try (BufferedWriter writer = new BufferedWriter(new FileWriter("/tmp/clob.txt"))) { try (BufferedReader reader = new BufferedReader(clob.getCharacterStream())) { CharBuffer buf = CharBuffer.wrap(new char[8 * 1024]); while ((reader.read(buf) > 0)) { writer.write(buf.array(), 0, buf.limit()); buf.flip(); } } } try (PreparedStatement dstPs = dstConn.prepareStatement(dstSql)) { dstPs.setClob(1, new FileReader("/tmp/clob.txt")); dstPs.executeUpdate(); } } } } } } ``` 开启4G内存依然OOM,可见最有效的方式还是通过byte以及MySQL的convert做字符集转换的方式 当然这样也仍然只能处理1G以内的大小,因为MySQL的max_allowed_packet最大为1G暂时无法避免
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签