• mysql数据迁移-8.0.25


    本文只简单描述一些逻辑迁移的问题,而且主要是针对开发过程中,小批量数据(例如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:	empmysqldump --fields-terminated-by="|" --fields-enclosed-by="`" --lines-terminated-by=0x0d0a
    在d:	empmysqldump下生成两个文件,
    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:	empmysqldump	able_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: empmysqldump目录,执行my.bat,执行结果如下:

    D: empmysqldump>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:	empmysqlpumpp.sql
    D:	empmysqlpump>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:	empmysqlpumpp.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暂时还没有(至少自带的是这样)

  • 相关阅读:
    UEmacs/PK Keybindings
    ubunut install golang
    vyos ipsec l2tp simple experiment
    Lynx 命令行操作
    Linux开启路由转发功能
    PROTEUS的元器件及模型制作
    5G模拟网自动化测试的需求和挑战
    vyos site-to-site ipsec simple experiment
    kubeadm 搭建 k8s 时用到的常用命令汇总
    html 特殊符号标记
  • 原文地址:https://www.cnblogs.com/lzfhope/p/15260551.html
Copyright © 2020-2023  润新知