Linux中修改mysql数据表

需求描述:项目中需要用新的板子替换掉旧的板子。旧板已在生产环境中使用,新板需要同步旧板的数据库数据

为了方便客户操作,计划通过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
相关推荐
ltl1 小时前
HTTP/3 实战:从 QUIC 到 H3 的完整请求链路
linux
独隅1 小时前
GitHub Actions 自动化运维实战:CI/CD 流水线一体化效果展示
运维·自动化·github
ltl2 小时前
POSIX 文件锁:flock、fcntl 与 NFS 上的工程陷阱
linux
ltl2 小时前
CUDA 生态:cuBLAS、cuDNN、NCCL、Triton、CUTLASS
linux
饺子大魔王的男人2 小时前
CentOS部署Cockpit:图形化查看系统、日志与服务状态
linux·运维·centos
不会就选b2 小时前
Linux之信号(二)
linux·运维·服务器
我是小灰灰吖3 小时前
QT在线安装器使用指南:从下载到配置完整教程
linux·qt·ubuntu
GlueNa2SiO33 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
qq_267612893 小时前
Gitee项目管理推荐:从工具链割裂到DevOps全链路贯通的企业级协作实践
运维·gitee·devops
灯澜忆梦4 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化