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 片段:

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

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

燕雀Logo
燕雀Logo

为用户提供LOGO免费设计在线生成服务

下载
# 导出全量结构 + 数据(含 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 数据快照能力——让每一次浏览器自动化测试,都从干净、可预测的数据库状态开始。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

639

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

热门下载

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

精品课程

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

共137课时 | 9万人学习

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

共6课时 | 9.1万人学习

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

共13课时 | 0.9万人学习

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

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