数据库工具推荐
120021、数据对比工具之 Diff
【工具介绍】:
江湖 JS 在数据同步方面,提供了基础的列表 diff 的工具,可以快速算出两个列表的对比情况,包括新增、删除、修改了哪些元素。
【使用 diff】:
- 引入 diff
const diff = require('@jianghujs/jianghu/app/common/diffUtil');
- 使用
const res = diff(oldList, newList, primaryKey);
// 或
const res = diff(oldList, newList); // primaryKey = 'id'
参数说明:
- oldList 要对比的旧数据列表
- newList 要对比的新数据列表
- primaryKey 对比时使用的主键 key,默认不填为 > - 'id',当填写之后,对比过程会忽略数据中的 id 字段,以 primaryKey 字段为准,对比非 id 的其它字段
使用场景1:对比时以 id 做主键 key
const res = diff(
[
{ id: 1, name: 'a' },
{ id: 2, name: 'b' },
{ id: 3, name: 'c' },
{ id: 4, name: 'd' },
{ id: 5, name: 'e' },
],
[
{ id: 1, name: 'a' },
{ id: 2, name: 'x' },
{ id: 7, name: 'e' },
]
);
console.log(JSON.stringify(res, null, ' '));
// 输出
// {
// "added": [
// { "id": 7, "name": "e" }
// ],
// "removed": [
// { "id": 3, "name": "c" },
// { "id": 4, "name": "d" },
// { "id": 5, "name": "e" }
// ],
// "changed": [
// {
// "old": { "id": 2, "name": "b" },
// "new": { "id": 2, "name": "x" }
// }
// ]
// }
使用场景2:对比时指定主键 key
当对比的数据源为视图和表时,由于视图的数据可能没有 id,只有业务主键,则需要指定主键 key,以指定字段做对比。
const res = diff(
[
{ id: 1, dataId: 'I', name: 'a' },
{ id: 2, dataId: 'II', name: 'b' },
{ id: 3, dataId: 'III', name: 'c' },
{ id: 4, dataId: 'IV', name: 'd' },
{ id: 5, dataId: 'V', name: 'e' },
],
[ // 来自 view,没有主键
{ dataId: 'I', name: 'a' },
{ dataId: 'II', name: 'x' },
{ dataId: 'VII', name: 'e' },
],
'dataId'
);
console.log(JSON.stringify(res, null, ' '));
// 输出
// {
// "added": [
// { "dataId": "VII", "name": "e" }
// ],
// "removed": [
// { "id": 3, "dataId": "III", "name": "c" },
// { "id": 4, "dataId": "IV", "name": "d" },
// { "id": 5, "dataId": "V", "name": "e" }
// ],
// "changed": [
// {
// "old": { "id": 2, "dataId": "II", "name": "b" },
// "new": { "dataId": "II", "name": "x" }
// }
// ]
// }
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 进行数据库备份和恢复的简单示例
# 创建全量备份
xtrabackup --backup --target-dir=/path/to/backup
# 创建增量备份
xtrabackup --backup --target-dir=/path/to/incremental_backup --incremental-basedir=/path/to/backup
# 还原全量备份
xtrabackup --prepare --target-dir=/path/to/backup
# 还原增量备份
xtrabackup --prepare --apply-log-only --target-dir=/path/to/incremental_backup --incremental-dir=/path/to/backup
# 恢复数据库
xtrabackup --copy-back --target-dir=/path/to/backup
这里的命令展示了完整备份、增量备份和恢复的基本用法,实际使用时需要根据数据库版本和具体需求进行参数调整。
【XtraBackUp安装】:
mysql5.7 要用 2.4版本
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
yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
【配置定时备份】:
- 将xtrabackup.sh上次至服务器
/www/backup/xtrabackup.sh
#!/bin/bash
timestamp=$(date +%Y%m%d_%H%M%S)
rm -rf /www/backup/xtrabackup_data/
mkdir -p /www/backup/xtrabackup_data
xtrabackup --backup --user=root --port=3306 --password=123456 --target-dir=/www/backup/xtrabackup_data &>> /www/wwwlogs/xtrabackup.log
mkdir -p /www/backup/xtrabackup_data_history
zip -r /www/backup/xtrabackup_data_history/xtrabackup_data_$timestamp.zip /www/backup/xtrabackup_data
echo " backup file output====> /www/backup/xtrabackup_data_history/xtrabackup_data_$timestamp.zip"
- 使用Linux 的 Crontab 配置 每天凌晨1点 运行
/www/backup/xtrabackup.sh
【使用 xtrabackup 备份的文件进行恢复】:
- 解压备份文件
首先,需要解压Xtrabackup备份文件。通常,备份文件是.tar或.tar.gz格式的归档文件。您可以使用tar命令解压缩备份文件:
$ tar -xvf backup.tar.gz
- 停止MySQL服务
在恢复备份之前,需要停止MySQL服务器。可以使用以下命令停止MySQL服务器:
$ sudo service mysql stop
- 准备备份文件
在解压缩备份文件后,需要使用innobackupex工具进行备份文件的准备。该工具会将备份文件的所有InnoDB表空间还原到指定的目录。可以使用以下命令准备备份文件:
$ innobackupex --apply-log /path/to/backup/directory
- 恢复备份
一旦备份文件准备好,可以使用innobackupex工具将备份还原到MySQL服务器中。可以使用以下命令恢复备份:
$ innobackupex --copy-back /path/to/backup/directory
- 更改文件权限
在备份还原完成后,需要更改数据目录的权限,以便MySQL服务器可以访问它。可以使用以下命令更改目录权限:
$ sudo chown -R mysql:mysql /var/lib/mysql
- 启动MySQL服务
最后,需要启动MySQL服务器并验证是否已成功还原备份。可以使用以下命令启动MySQL服务器:
$ sudo service mysql start
【FAQ】
问题: _resource_request_log占用磁盘太大
问题Fix:
1. 数据清理: 定时任务清理 _resource_request_log历史数据
2. 减少新增数据: jianghuConfig: { ignoreListOfResourceRequestLog: [
'allPage.getConstantList', 'allPage.httpUploadByStream', 'allPage.httpUploadByBase64', 'allPage.httpDownloadByBase64',
'socket.disconnect', 'socket.connect', 'index.pingRecord', 'chat.getGroupInfo',
'allPage.getUserGroupRoleList', 'allPage.userInfo', 'chat.getMessageHistory'
]}
3. 优化表空间: 将`optimize table _resource_request_log;` 添加到 定时任务中
这两个工具分别用于数据库对比和备份,为开发者提供了在数据库管理和维护中的重要支持。