• mysqldump与mysqlpump比较


    本文版本 mysql 5.7.26

    【mysqldump默认参数】

    all-databases                     FALSE
    all-tablespaces                   FALSE
    no-tablespaces                    FALSE
    add-drop-database                 FALSE
    add-drop-table                    TRUE
    add-drop-trigger                  FALSE
    add-locks                         TRUE
    allow-keywords                    FALSE
    apply-slave-statements            FALSE
    bind-address                      (No default value)
    character-sets-dir                (No default value)
    comments                          TRUE
    compatible                        (No default value)
    compact                           FALSE
    complete-insert                   FALSE
    compress                          FALSE
    create-options                    TRUE
    databases                         FALSE
    default-character-set             utf8
    delete-master-logs                FALSE
    disable-keys                      TRUE
    dump-slave                        0
    events                            FALSE
    extended-insert                   TRUE
    fields-terminated-by              (No default value)
    fields-enclosed-by                (No default value)
    fields-optionally-enclosed-by     (No default value)
    fields-escaped-by                 (No default value)
    flush-logs                        FALSE
    flush-privileges                  FALSE
    force                             FALSE
    hex-blob                          FALSE
    host                              (No default value)
    ignore-error                      (No default value)
    include-master-host-port          FALSE
    insert-ignore                     FALSE
    lines-terminated-by               (No default value)
    lock-all-tables                   FALSE
    lock-tables                       TRUE
    log-error                         (No default value)
    master-data                       0
    max-allowed-packet                25165824
    net-buffer-length                 1046528
    no-autocommit                     FALSE
    no-create-db                      FALSE
    no-create-info                    FALSE
    no-data                           FALSE
    order-by-primary                  FALSE
    port                              3306
    quick                             TRUE
    quote-names                       TRUE
    replace                           FALSE
    routines                          FALSE
    set-charset                       TRUE
    single-transaction                FALSE
    dump-date                         TRUE
    socket                            /data/mysql/mysql.sock
    secure-auth                       TRUE
    ssl                               TRUE
    ssl-verify-server-cert            FALSE
    ssl-ca                            (No default value)
    ssl-capath                        (No default value)
    ssl-cert                          (No default value)
    ssl-cipher                        (No default value)
    ssl-key                           (No default value)
    ssl-crl                           (No default value)
    ssl-crlpath                       (No default value)
    tls-version                       (No default value)
    tab                               (No default value)
    triggers                          TRUE
    tz-utc                            TRUE
    user                              (No default value)
    verbose                           FALSE
    where                             (No default value)
    plugin-dir                        (No default value)
    default-auth                      (No default value)
    enable-cleartext-plugin           FALSE

    (1.1)mysqldump默认启动的参数(5.7)

    我们可以看到 为 true的

    add-drop-table                    TRUE            -- 有 drop table if exist
    add-locks                         TRUE            -- 允许加锁,避免tuncate alter 等ddl
    comments                          TRUE            -- 导出注释
    create-options                    TRUE            -- 创建语句
    default-character-set             utf8            -- 默认utf8 字符集
    disable-keys                      TRUE            -- 使用ALTER TABLE ... DISABLE KEYS要告诉MySQL停止更新非唯一索引
    dump-slave                        0               -- 是否是在从库备份,开启参数为1 可以获取到主库binlog位置
    extended-insert                   TRUE            -- 默认可以把所有数据从每行数据1个insert into,变成insert into values(),()
    lock-tables                       TRUE            -- 默认运行锁表
    master-data                       0                -- 默认不做任何binlog情况操作与收集
    max-allowed-packet                25165824        -- 每次导出的最大包大小
    net-buffer-length                 1046528        -- TCP/IP SOCKET连接 缓存大小
    port                              3306            -- 默认端口 3306
    quick                             TRUE            -- 不要用 buffer 缓存mysqldump里的查询,直接转储到标准输出            
    quote-names                       TRUE            -- 就是把表名、列名等使用 `` 包起来,以免与关键字等冲突
    set-charset                       TRUE            -- 增加 SET NAMES default_character_set 到默认输出
    dump-date                         TRUE            -- 在标准输出最末尾,加上dump完成时间
    socket                            /data/mysql/mysql.sock    -- 默认 mysql socket  位置,这个是我在 my.cnf 中的 [mysql] 里面改了,默认的应该是 /var/local/mysql 下目录
    secure-auth                       TRUE            -- 默认拒绝使用 4.1.1之前的老协议连接
    ssl                               TRUE            -- 默认支持ssl
    triggers                          TRUE            -- 默认会导出触发器
    tz-utc                            TRUE            -- 允许时区

    【2】mysqlpump(5.7)

    (2.1)功能特性

    • 并行处理数据库和数据库中的对象,以加快转储过程

    • 更好地控制要转储的数据库和数据库对象(表、存储的程序、用户帐户)

    • 将用户帐户转储为帐户管理语句 ( CREATE USERGRANT) 而不是插入mysql系统数据库

    • 创建压缩输出的能力

    • 进度指标(数值为估计值)

    • 对于转储文件重新加载,InnoDB通过在插入行后添加索引来更快地为表 创建二级索引

    (2.2)常用参数

    参数

    说明

    --default-parallelism=#

    设置并行导出的并发度默认为2,如果为0则不并行,5.7.11后解决了--single-transaction才能与--default-parallelism共用

    --single-transaction

    创建一个单独的事务来导出所有的表,5.7.11后解决了--single-transaction才能与--default-parallelism共用

    --exclude-databases=name

    导出时排除掉某些库,多个库以逗号分隔

    --exclude-tables=name

    导出时排除掉某些表,多个表以逗号分隔

    --include-databases=name

    导出时包含某些库,多个库以逗号分隔

    --include-tables=name

    导出时包含某些表,多个表以逗号分隔

     --users

    导出 create user ,grant 语句

    (2.3)mysqlpump自带默认参数(5.7)

    default-character-set             UTF8MB4    -- 默认字符集
    default-parallelism              2            -- 默认2线程
    defer-table-indexes               TRUE        -- 在导出所有行之后,再加索引
    events                            TRUE        -- 默认导出事件
    extended-insert                  250            -- 把每行一个 insert into 变成
    max-allowed-packet               25165824    -- 默认最大包大小
    net-buffer-length                1047552        -- 网络缓存大小
    password                          *            -- 密码
    port                             3306        -- 端口
    routines                          TRUE        -- 默认自带存储过程
    set-charset                       TRUE        -- set names default-character-set 
    set-gtid-purged                   AUTO        -- 自动,但不写会报错
    socket                            /data/mysql/mysql.sock    --socket
    triggers                          TRUE        -- 默认自带存储过程
    tz-utc                            TRUE        -- 支持时区
    watch-progress                    TRUE        -- 导出时显示进度

    到8.0 默认的 存储过程,触发器等参数 又会因为系统表的改进而默认不备份,所以无论什么时候什么情况,存储过程、事件、触发器等 参数还是加上吧;

    【最佳实践】mysqldump与mysqlpupm对比

    (1)构造5个100W行数据表

    sysbench参考:https://www.cnblogs.com/gered/p/14142946.html#autoid-5-0-0

    sysbench oltp_common --mysql_storage_engine=innodb --db-driver=mysql --mysql-host=localhost --mysql-port=3306 
    --mysql-user=root --mysql-password=bfgame20 --mysql-db=test --threads=4 --table_size=1000000 --tables=5 --mysql-socket=/data/mysql/mysql.sock prepare

    (2)实际执行时间对比

    mysqldump:

    time mysqldump --single_transaction --default-character-set=utf8mb4 --master-data=2 test sbtest1 sbtest2 sbtest3 sbtest4 sbtest5 >/data/tmp.txt
    Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. 
    
    real    0m12.329s
    user    0m10.500s
    sys     0m1.304s

    mysqlpump:

    time mysqlpump --default-character-set=utf8mb4 --set-gtid-purged=ON --host=localhost --single-transaction test sbtest1 sbtest2 sbtest3 sbtest4 sbtest5 >/data/tmp1.txt
    mysqlpump: [WARNING] (1429) Unable to connect to foreign data source: Access denied for user 'leoaprd'@'10.20.53.12' (using password: 
    mysqlpump: [WARNING] (1429) Unable to connect to foreign data source: Access denied for user 'leoaprd'@'10.20.53.12' (using password: 
    Dump progress: 0/5 tables, 250/4932000 rows
    Dump progress: 0/5 tables, 806250/4932000 rows
    Dump progress: 0/5 tables, 1700250/4932000 rows
    Dump progress: 2/5 tables, 2611250/4932000 rows
    Dump progress: 2/5 tables, 3520000/4932000 rows
    Dump progress: 4/5 tables, 4204500/4932000 rows
    Dump progress: 4/5 tables, 4636000/4932000 rows
    Dump completed in 7608 milliseconds
    
    real    0m7.676s
    user    0m11.274s
    sys     0m0.937s

    执行效率结论:

      同500W行,那么 mysqlpump 默认使用了多线程基于表的并行 导出;所以快了不少

    500W数据,5个表

      mysqldump:12.32s  mysqlpump:7.67s

    (3)导出内容对比

    概述:mysqldump mysqlpump导出的内容影响

      MySQL8.0之后,在使用mysqldump和mysqlpump导出数据时候,与之前有了一些不同,主要是以下几点:

        之前版本的mysqldump和mysqlpump可以导出mysql系统库中的所有表的内容,8.0之后,只能导出mysql系统库中没有数据的数据字典表。

        之前版本当使用 --all-databases 参数导出数据的时候,不加 --routines和 --events选项也可以导出触发器、存储过程等信息;

        因为这些信息都存放于proc和event表中,导出所有表即可导出这些信息。

      但是在8.0中,proc表和event表都不再使用,并且定义触发器、存储过程的数据字典表不会被导出,所以在8.0中使用mysqldump、mysqlpump导出数据的时候,如果需要导出触发器、存储过程等内容,一定需要加上 --routines和 --events选项。

        之前版本中 --routines选项导出的时候,备份账户需要有proc表的SELECT权限,在8.0中需要对所有表的SELECT权限

        之前版本中,导出触发器、存储过程可以同时导出触发器、存储过程的创建和修改的时间戳,8.0中不再支持。

    (3.1)导出内容的实质区别

    mysqldump    mysqlpump
    固定根据max_allow_packet,拆分insert into values个数 根据extended-insert ,默认每250行汇成一个Insert
    建一个表,插入一个表的数据 并行N个线程,会先建N个表,插入N个表的数据
    建表时建好所有索引,然后禁用非唯一索引插入数据 建表时只建立唯一索引(主键也算),插完数据后建其他索引
    可以保证一致性 --single_transaction 就算不使用 --single_transaction 也可以保证一致性
    可以通过--master-data 来获取binlog位置 无法获取binlog 位置,只能获取gtid,且set-gtid-purged必填

    mysqlpump 还有相关优点:

    • 并行处理数据库和数据库中的对象,以加快转储过程

    • 更好地控制要转储的数据库和数据库对象(表、存储的程序、用户帐户)

    • 将用户帐户转储为帐户管理语句 ( CREATE USERGRANT) 而不是插入mysql系统数据库

    • 创建压缩输出的能力

    • 进度指标(数值为估计值)

    • 对于转储文件重新加载,InnoDB通过在插入行后添加索引来更快地为表 创建二级索引

    (4)优缺点对比

     mysqlpump

      • 优点:
        • 基于表并行备份数据库和数据库中对象,加快备份过程。(--default-parallelism)
        • 更好地控制数据库和数据库对象(表,存储过程,用户帐户)的备份。
        • 备份用户账号作为帐户管理语句(CREATE USER,GRANT),而不是直接插入到MySQL的系统数据库。
        • 支持直接压缩导出
        • 导出可显示进度(估计值)。
        • 导出时可以排除或指定数据库。
        • 导入备份文件时,先建表后插入数据最后建立索引,减少了索引维护开销,加快了还原速度。
      • 缺点:  
        • 官方表示在5.7.11之前无法保证数据的一致性,所以5.7.11之前该工具基本无法使用
        • 5.7.11之前,--defaut-parallelism>0时与--single-transaction互斥,无法使用并行。直到5.7.11才解决了--single-transaction和--default-parallelism互斥的问题
        • 只能并行到表级别,如果有一个表数据量特别大那么会存在非常严重的短板效应,甚至不如mysqldump。
        • 导出的数据保存在一个文件中,导入仍旧是单线程,效率较低。
        • 无法获取当前备份对应的binlog位置。
        • 无法多版本兼容,不像Mysqldump 什么版本都可以用,yyds啊!

    【参考文档】

    https://www.jb51.net/article/212882.htm

    https://blog.csdn.net/Hehuyi_In/article/details/102981945

  • 相关阅读:
    kernel 单独编译模块
    Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法
    Python实现BFS和DFS
    dpdk 20.02 igb_uio.ko 编译
    Kubernetes 文档
    controller-runtime/FAQ.md
    kubebuilder2.0学习笔记——进阶使用
    cloud-init 导致虚拟机启动太慢
    关闭 cloud-init 服务
    centos7 安装 docker calico
  • 原文地址:https://www.cnblogs.com/gered/p/15344251.html
Copyright © 2020-2023  润新知