0

0

Linux 命令行下高效备份与恢复 SQL Server 数据库的完整实践指南

碧海醫心

碧海醫心

发布时间:2026-01-21 16:36:16

|

223人浏览过

|

来源于php中文网

原创

Linux 命令行下高效备份与恢复 SQL Server 数据库的完整实践指南

本文介绍在 linux 环境(尤其是 docker 容器化场景)中,使用 `mssql-scripter` 和 `sqlcmd` 实现 sql server 数据库的自动化导出(含结构与数据)与导入,完美替代 postgresql 中 `pg_dump`/`psql` 的工作流。

在基于 Docker 的 PHP 自动化测试环境中,频繁重置数据库至基线状态是刚需。不同于 PostgreSQL 生态成熟的 pg_dump/psql,SQL Server 在 Linux 下原生缺乏开箱即用的 CLI 导出/导入工具。但通过微软官方维护的 mssql-scripter(基于 Python 的跨平台脚本生成器)配合 sqlcmd(轻量级命令行执行器),可构建稳定、可复现的自动化数据快照流水线。

✅ 核心工具链说明

工具 用途 类比
mssql-scripter 生成包含 DDL(表/索引/约束)和 DML(INSERT)的 .sql 脚本 ≈ pg_dump --clean --schema-and-data
sqlcmd 执行 SQL 脚本文件或单条语句 ≈ psql -f dump.sql
⚠️ 注意:mssql-scripter 不直接执行恢复操作,它只生成可执行的 T-SQL 脚本;实际导入必须由 sqlcmd 或其他 SQL Server 客户端完成。

? 推荐 Docker 构建方案(适配现代 OpenSSL 与编码

由于上游 mssql-scripter 存在已知兼容性问题(如 Issue #236),需手动集成新版 sqltoolsservice 并修复 UTF 编码缺陷。以下为生产就绪的多阶段精简版 Dockerfile 片段:

VIVA
VIVA

一个免费的AI创意视觉设计平台

下载
FROM ubuntu:22.04

# 安装依赖与 SQL Server 工具链
RUN apt-get update && apt-get install -y \
      curl wget gnupg unzip libunwind8 \
      && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
      && curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/msprod.list \
      && apt-get update \
      && apt-get install -y msodbcsql18 mssql-tools18 \
      && echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc

# 安装 Python 3.9+ 与 mssql-scripter
RUN apt-get install -y python3-pip python3-dev \
      && pip3 install --no-cache-dir mssql-scripter==1.0.0a15

# 替换 sqltoolsservice(关键!解决 OpenSSL 3.x 兼容性)
ARG SQLTOOLS_URL=https://github.com/microsoft/sqltoolsservice/releases/download/v3.0.0-release.205/Microsoft.SqlTools.ServiceLayer-rhel-x64-net6.0.tar.gz
RUN mkdir -p /opt/Microsoft.SqlTools.ServiceLayer \
      && curl -sSL $SQLTOOLS_URL | tar -xzf - -C /opt/Microsoft.SqlTools.ServiceLayer --strip-components=1

# 修复 UTF-8 编码 bug(强制使用 UTF-16 输出,避免 BOM/乱码)
RUN sed -i 's/utf-8/utf-16/g' /usr/local/lib/python3.*/dist-packages/mssqlscripter/main.py

ENV MSSQLTOOLSSERVICE_PATH=/opt/Microsoft.SqlTools.ServiceLayer
ENV LANG=C.UTF-8

# 验证安装
RUN mssql-scripter --help >/dev/null && sqlcmd -? >/dev/null || exit 1

✅ 构建后,容器内即可执行标准化命令:

# 导出全量结构 + 数据(含 DROP + CREATE + INSERT)
mssql-scripter -S mssql-host -d mydb -U sa -P 'MyPass!123' \
  --schema-and-data \
  --exclude-object-type Login,User,Role,ServerRoleMembership \
  --target-server-version SQLServer2019 \
  > dump.sql

# 导入(注意:目标库需已存在,且用户有 db_owner 权限)
/opt/mssql-tools18/bin/sqlcmd -S mssql-host -d mydb -U sa -P 'MyPass!123' -i dump.sql

? 关键注意事项与最佳实践

  • 权限要求:mssql-scripter 需要 db_owner 或 VIEW DEFINITION + SELECT 权限;sqlcmd 导入需 db_ddladmin + db_datawriter。
  • 字符集安全:务必使用 --encoding utf-16(或通过上述 patch 强制)避免中文/特殊字符乱码;生成脚本建议用 iconv -f UTF-16 -t UTF-8 dump.sql 转换后再检查。
  • 排除对象:测试环境应显式 --exclude-object-type Login,User,避免跨环境 SID 冲突。
  • 事务控制:sqlcmd 默认不开启事务,若需原子性恢复,可在 dump.sql 开头添加 BEGIN TRY BEGIN TRANSACTION ... COMMIT END TRY BEGIN CATCH ROLLBACK; THROW; END CATCH 包裹逻辑(需自行注入)。
  • 替代方案参考
    • 若仅需数据迁移(非结构重建),可用 bcp(更高效,但无 schema 导出能力);
    • 若接受容器内运行 PowerShell,Invoke-SqlCmd + Export-SqlData 是 Windows 方案,但不符合纯 Linux 要求;
    • PHP 项目中也可直接调用 exec() 封装上述命令,无需额外语言栈。

通过该方案,你将获得与 pg_dump/psql 行为高度一致、可 CI/CD 集成、完全容器化的 SQL Server 数据快照能力——让每一次浏览器自动化测试,都从干净、可预测的数据库状态开始。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2152

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1683

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号