需求描述:项目中需要用新的板子替换掉旧的板子。旧板已在生产环境中使用,新板需要同步旧板的数据库数据
为了方便客户操作,计划通过shell脚本+u盘实现上述需求:
(1)在旧板插入u盘后,自动调用u盘中的脚本,获取旧板上的mysql数据库中的某个数据表
(2)然后在新板插入u盘,用新的数据表替换
(3)需要另写一个程序:识别u盘的拔插,以及根据ini配置文件自动执行u盘中的对应的脚本
这样在运行程序后,客户只需要拔插u盘就能实现数据库替换
本文主要介绍(1)(2)两步的实现过程
板子系统环境:ubuntu20.04
实现思路:通过mysqldump工具将旧板上的数据表导出到u盘,同样也是通过mysqldump将u盘中的数据表导入到新板上
一、mysqldump介绍
mysqldump 是 MySQL 提供的一个命令行工具,用于备份 MySQL 数据库或表的内容。它可以将数据库或表的数据导出为 SQL 文件,该文件包含创建表和插入数据的 SQL 语句。mysqldump 既可以用于数据库的备份,也可以用于数据库迁移和数据恢复。
基本用法
1、备份整个数据库
bash
mysqldump -u 用户名 -p 数据库名 > 备份文件.sql
bash
##示例
mysqldump -u root -p mydb > mydb_backup.sql
2、备份多个数据库
bash
mysqldump -u 用户名 -p --databases 数据库1 数据库2 > 备份文件.sql
bash
##示例
mysqldump -u root -p --databases db1 db2 > multi_db_backup.sql
3、备份所有数据库
bash
mysqldump -u 用户名 -p --all-databases > 备份文件.sql
bash
##示例
mysqldump -u root -p --all-databases > all_db_backup.sql
4、备份单个表
bash
mysqldump -u 用户名 -p 数据库名 表名 > 备份文件.sql
bash
##示例
mysqldump -u root -p mydb mytable > mytable_backup.sql
项目中的需要比较简单,只需要替换掉一个数据表
二、获取旧板上的数据表
实现脚本
bash
#!/bin/bash
#此脚本用于将设备上的数据表拷贝出来
DB_NAME="Gateway" # 数据库名
TABLE_NAME="PortInfo" # 要拷贝的数据表名
USB_PATH="/userdata/workspace/runningspace/Upgrade" # U 盘挂载路径
DB_USER="root" # 数据库用户名
DB_PASS="???" # 数据库密码
SQL_FILE="${TABLE_NAME}_export.sql"
# --- 1. 环境检查与自动安装 ---
# 检查 mysqldump 命令是否存在
if ! command -v mysqldump &> /dev/null; then
echo "未检测到 mysqldump 工具,正在尝试安装..."
# 更新软件源并安装 mysql-client (包含 mysqldump)
sudo apt-get update && sudo apt-get install -y mysql-client
# 再次检查安装是否成功
if [ $? -ne 0 ]; then
echo "错误: 无法安装 mysql-client,请检查网络连接或权限。"
exit 1
fi
echo "mysqldump 安装成功。"
else
echo "检测到 mysqldump 已存在,跳过安装。"
fi
# --- 2. 挂载检查 ---
if [ ! -d "$USB_PATH" ]; then
echo "错误: 未找到 U 盘挂载路径 $USB_PATH"
exit 1
fi
# --- 3. 执行导出 ---
echo "正在导出表 ${TABLE_NAME}..."
# 使用 mysqldump 导出
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} ${TABLE_NAME} > "${USB_PATH}/${SQL_FILE}"
if [ $? -eq 0 ]; then
echo "成功:表已保存至 ${USB_PATH}/${SQL_FILE}"
# 强制刷盘,确保数据真正写入 U 盘
sync
else
echo "失败:导出过程中出现错误。"
exit 1
fi
三、替换新板上的数据表
实现脚本
bash
#!/bin/bash
#此脚本用于将u盘上的数据表导入到设备
DB_NAME="Gateway" # 数据库名
TABLE_NAME="PortInfo" #数据表名
USB_PATH="/userdata/workspace/runningspace/Upgrade"
DB_USER="root"
DB_PASS="EmbedSky"
SQL_FILE="${TABLE_NAME}_export.sql"
BACKUP_FILE="${TABLE_NAME}_local_bak.sql"
if [ ! -f "${USB_PATH}/${SQL_FILE}" ]; then
echo "错误: U 盘中不存在文件 ${SQL_FILE}"
exit 1
fi
# 1. 备份设备 2 现有的表(以防万一)
echo "正在备份设备 2 原有的表数据..."
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} ${TABLE_NAME} > "/tmp/${BACKUP_FILE}" 2>/dev/null
if [ $? -eq 0 ]; then
echo "原有表已备份至 /tmp/${BACKUP_FILE}"
else
echo "提示:原表不存在或备份跳过,准备直接导入。"
fi
# 2. 导入 U 盘中的数据
# mysqldump 默认生成的 SQL 包含 DROP TABLE IF EXISTS,所以会自动替换
echo "正在从 U 盘恢复表数据..."
mysql -u${DB_USER} -p${DB_PASS} ${DB_NAME} < "${USB_PATH}/${SQL_FILE}"
if [ $? -eq 0 ]; then
echo "成功:表 ${TABLE_NAME} 已成功替换!"
else
echo "错误:导入失败,请检查数据库权限或 SQL 文件。"
exit 1
fi