数据库工具推荐

12002

1、数据对比工具之 Diff

【工具介绍】:

江湖 JS 在数据同步方面,提供了基础的列表 diff 的工具,可以快速算出两个列表的对比情况,包括新增、删除、修改了哪些元素。

【使用 diff】:

  • 引入 diff
  1. const diff = require('@jianghujs/jianghu/app/common/diffUtil');
  • 使用
  1. const res = diff(oldList, newList, primaryKey);
  2. // 或
  3. const res = diff(oldList, newList); // primaryKey = 'id'

参数说明:

  • oldList 要对比的旧数据列表
  • newList 要对比的新数据列表
  • primaryKey 对比时使用的主键 key,默认不填为 > - 'id',当填写之后,对比过程会忽略数据中的 id 字段,以 primaryKey 字段为准,对比非 id 的其它字段
  • 使用场景1:对比时以 id 做主键 key

    1. const res = diff(
    2. [
    3. { id: 1, name: 'a' },
    4. { id: 2, name: 'b' },
    5. { id: 3, name: 'c' },
    6. { id: 4, name: 'd' },
    7. { id: 5, name: 'e' },
    8. ],
    9. [
    10. { id: 1, name: 'a' },
    11. { id: 2, name: 'x' },
    12. { id: 7, name: 'e' },
    13. ]
    14. );
    15. console.log(JSON.stringify(res, null, ' '));
    16. // 输出
    17. // {
    18. // "added": [
    19. // { "id": 7, "name": "e" }
    20. // ],
    21. // "removed": [
    22. // { "id": 3, "name": "c" },
    23. // { "id": 4, "name": "d" },
    24. // { "id": 5, "name": "e" }
    25. // ],
    26. // "changed": [
    27. // {
    28. // "old": { "id": 2, "name": "b" },
    29. // "new": { "id": 2, "name": "x" }
    30. // }
    31. // ]
    32. // }
  • 使用场景2:对比时指定主键 key

当对比的数据源为视图和表时,由于视图的数据可能没有 id,只有业务主键,则需要指定主键 key,以指定字段做对比。

  1. const res = diff(
  2. [
  3. { id: 1, dataId: 'I', name: 'a' },
  4. { id: 2, dataId: 'II', name: 'b' },
  5. { id: 3, dataId: 'III', name: 'c' },
  6. { id: 4, dataId: 'IV', name: 'd' },
  7. { id: 5, dataId: 'V', name: 'e' },
  8. ],
  9. [ // 来自 view,没有主键
  10. { dataId: 'I', name: 'a' },
  11. { dataId: 'II', name: 'x' },
  12. { dataId: 'VII', name: 'e' },
  13. ],
  14. 'dataId'
  15. );
  16. console.log(JSON.stringify(res, null, ' '));
  17. // 输出
  18. // {
  19. // "added": [
  20. // { "dataId": "VII", "name": "e" }
  21. // ],
  22. // "removed": [
  23. // { "id": 3, "dataId": "III", "name": "c" },
  24. // { "id": 4, "dataId": "IV", "name": "d" },
  25. // { "id": 5, "dataId": "V", "name": "e" }
  26. // ],
  27. // "changed": [
  28. // {
  29. // "old": { "id": 2, "dataId": "II", "name": "b" },
  30. // "new": { "dataId": "II", "name": "x" }
  31. // }
  32. // ]
  33. // }

2、数据库备份之 Xtrabackup

【工具介绍】:

xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。

xtrabackup包含两个主要的工具,即xtrabackup和innobackupex:

  • xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表
  • innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份

【特性】:

  • 热备份: Xtrabackup 支持热备份,即在数据库运行时进行备份,而无需停止数据库服务。
  • 增量备份: Xtrabackup 提供了增量备份的功能,可以基于先前的全量备份创建仅包含更改的增量备份,从而减少备份所需的时间和空间。
  • 压缩和流式备份: Xtrabackup 支持将备份数据进行压缩,以节省存储空间,并且可以将备份数据以流的形式传输到其他服务器,便于备份数据的传输和存储。
  • 恢复: Xtrabackup 提供了恢复工具,可以使用备份数据还原整个数据库至某个时间点。

【代码示例】:

以下是一个使用 Xtrabackup 进行数据库备份和恢复的简单示例

  1. # 创建全量备份
  2. xtrabackup --backup --target-dir=/path/to/backup
  3. # 创建增量备份
  4. xtrabackup --backup --target-dir=/path/to/incremental_backup --incremental-basedir=/path/to/backup
  5. # 还原全量备份
  6. xtrabackup --prepare --target-dir=/path/to/backup
  7. # 还原增量备份
  8. xtrabackup --prepare --apply-log-only --target-dir=/path/to/incremental_backup --incremental-dir=/path/to/backup
  9. # 恢复数据库
  10. xtrabackup --copy-back --target-dir=/path/to/backup

这里的命令展示了完整备份、增量备份和恢复的基本用法,实际使用时需要根据数据库版本和具体需求进行参数调整。

【XtraBackUp安装】:

mysql5.7 要用 2.4版本

安装教程

  1. wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
  2. yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

【配置定时备份】:

  1. xtrabackup.sh上次至服务器/www/backup/xtrabackup.sh
    1. #!/bin/bash
    2. timestamp=$(date +%Y%m%d_%H%M%S)
    3. rm -rf /www/backup/xtrabackup_data/
    4. mkdir -p /www/backup/xtrabackup_data
    5. xtrabackup --backup --user=root --port=3306 --password=123456 --target-dir=/www/backup/xtrabackup_data &>> /www/wwwlogs/xtrabackup.log
    6. mkdir -p /www/backup/xtrabackup_data_history
    7. zip -r /www/backup/xtrabackup_data_history/xtrabackup_data_$timestamp.zip /www/backup/xtrabackup_data
    8. echo " backup file output====> /www/backup/xtrabackup_data_history/xtrabackup_data_$timestamp.zip"
  2. 使用Linux 的 Crontab 配置 每天凌晨1点 运行/www/backup/xtrabackup.sh

【使用 xtrabackup 备份的文件进行恢复】:

  1. 解压备份文件
    首先,需要解压Xtrabackup备份文件。通常,备份文件是.tar或.tar.gz格式的归档文件。您可以使用tar命令解压缩备份文件:
  1. $ tar -xvf backup.tar.gz
  1. 停止MySQL服务
    在恢复备份之前,需要停止MySQL服务器。可以使用以下命令停止MySQL服务器:
  1. $ sudo service mysql stop
  1. 准备备份文件
    在解压缩备份文件后,需要使用innobackupex工具进行备份文件的准备。该工具会将备份文件的所有InnoDB表空间还原到指定的目录。可以使用以下命令准备备份文件:
  1. $ innobackupex --apply-log /path/to/backup/directory
  1. 恢复备份
    一旦备份文件准备好,可以使用innobackupex工具将备份还原到MySQL服务器中。可以使用以下命令恢复备份:
  1. $ innobackupex --copy-back /path/to/backup/directory
  1. 更改文件权限
    在备份还原完成后,需要更改数据目录的权限,以便MySQL服务器可以访问它。可以使用以下命令更改目录权限:
  1. $ sudo chown -R mysql:mysql /var/lib/mysql
  1. 启动MySQL服务
    最后,需要启动MySQL服务器并验证是否已成功还原备份。可以使用以下命令启动MySQL服务器:
  1. $ sudo service mysql start

【FAQ】

问题: _resource_request_log占用磁盘太大
问题Fix:

  1. 1. 数据清理: 定时任务清理 _resource_request_log历史数据
  2. 2. 减少新增数据: jianghuConfig: { ignoreListOfResourceRequestLog: [
  3. 'allPage.getConstantList', 'allPage.httpUploadByStream', 'allPage.httpUploadByBase64', 'allPage.httpDownloadByBase64',
  4. 'socket.disconnect', 'socket.connect', 'index.pingRecord', 'chat.getGroupInfo',
  5. 'allPage.getUserGroupRoleList', 'allPage.userInfo', 'chat.getMessageHistory'
  6. ]}
  7. 3. 优化表空间: 将`optimize table _resource_request_log;` 添加到 定时任务中

这两个工具分别用于数据库对比和备份,为开发者提供了在数据库管理和维护中的重要支持。