类别:SQL数据库 / 日期:2025-11-19 / 浏览:28 / 评论:0
服务器A的数据库名为spd,备份出的数据库文件为spd_20251118010001.sql。需要还原的服务器B数据库中存在spd和spd_pre。现在需要将spd_20251118010001.sql文件导入到B服务器的spd_pre中。
错误方法:
在B服务器中使用
mysql -u root -p spd_pre < /tmp/spd_20251118010001.sql
即使要求导入到spd_pre,但结果却导入到B服务器中的spd数据库中了。
使用命令
head -30 spd_20251118010001.sql
分析spd_20251118010001.sql文件,发现里面已指定了spd数据库USE `spd`,所以以上命令的spd_pre无效
bash-4.4# head -30 spd_20251118010001.sql -- MySQL dump 10.13 Distrib 8.0.29, for Linux (x86_64) -- -- Host: 127.0.0.1 Database: spd -- ------------------------------------------------------ -- Server version 8.0.29 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Current Database: `spd` -- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `spd` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; USE `spd`; -- -- Table structure for table `12月计费数据_临时补` -- DROP TABLE IF EXISTS `12月计费数据_临时补`;
处理方法有:
方法一(建议):使用以下命令修改原始的spd_20251118010001.sql 文件
sed -i 's/`spd`/`spd_pre`/g' /tmp/spd_20251118010001.sql
再次执行导入命令,导入到B服务器的spd_pre中:
mysql -u root -p spd_pre < /tmp/spd_20251118010001.sql
方法二:正常导入到B服务器的spd中,然后使用以下命令,将spd复制到spd_pre中。
mysqldump -u root -p --single-transaction spd | sed 's/`spd`/`spd_pre`/g' | mysql -u root -p spd_pre
以上命令分步解析
第1部分:mysqldump -u root -p --single-transaction spd
mysqldump:MySQL官方备份工具
-u root:使用root用户连接数据库
-p:提示输入密码
--single-transaction:关键参数 - 在事务中执行备份,确保数据一致性,不会锁表
spd:要备份的源数据库名称
输出:生成spd数据库的SQL格式备份(包含表结构、数据等)
第2部分:sed 's/`spd`/`spd_pre`/g'
sed:流编辑器,用于文本替换
s/.../.../:替换命令语法
s/`spd`/`spd_pre`/g:将所有反引号包裹的spd替换为spd_pre
g:全局替换(每行所有匹配项都替换)
------set 带-i参数说明------
# 安全操作流程 cp backup.sql backup.sql.bak # 先备份 sed 's/`spd`/`spd_pre`/g' backup.sql | head -10 # 预览前10行 sed -i 's/`spd`/`spd_pre`/g' backup.sql # 确认后执行修改
------------
替换示例:
`spd` → `spd_pre`
CREATE DATABASE `spd` → CREATE DATABASE `spd_pre`
USE `spd`; → USE `spd_pre`;
第3部分:mysql -u root -p spd_pre
mysql:MySQL客户端命令
-u root -p:使用root用户登录并输入密码
spd_pre:指定要导入的目标数据库

