如何通过命令行生成MS-SQL数据库备份脚本?Windows认证如何配置?
MS SQL命令行生成结构+数据备份脚本(类似MySQL mysqldump)
刚好我之前也折腾过这个需求,MS SQL里有几个对应mysqldump的命令行方案,给你整理成实用的步骤:
1. 推荐:用mssql-scripter(官方跨平台工具)
这个是微软官方推出的开源工具,用法和mysqldump几乎一致,支持导出结构+数据,还能指定要导出的对象类型,非常省心。
首先得先安装它,用pip就行(前提是你装了Python):
pip install mssql-scripter
1.1 SQL Server身份认证(对应MySQL的-u/-p)
直接用下面的命令,把参数换成你的实际信息:
mssql-scripter -S <你的服务器实例> -d <数据库名> -U <用户名> -P <密码> --include-objects "Tables,Sequences" --schema-and-data > db_backup.sql
参数说明:
-S:比如你的本地默认实例就是localhost,如果是命名实例(比如SQLEXPRESS)就写localhost\SQLEXPRESS-U/-P:对应MySQL的-u和-p,注意这里密码是大写-P,直接跟密码不需要空格--include-objects:明确指定要导出表和序列,避免导出其他不需要的对象--schema-and-data:同时导出结构(CREATE语句)和数据(INSERT语句)
1.2 Windows身份认证(集成登录)
不需要输入用户名密码,改用-E参数表示用当前Windows账号登录:
mssql-scripter -S <你的服务器实例> -d <数据库名> -E --include-objects "Tables,Sequences" --schema-and-data > db_backup.sql
2. 原生方案:用sqlcmd配合自定义脚本
如果不想装额外工具,SQL Server自带的sqlcmd也能搞定,不过需要自己写个SQL脚本生成语句。
2.1 Windows身份认证版本
先创建一个名为generate_backup.sql的脚本文件,内容如下(简化版,能生成基础的CREATE和INSERT语句,复杂表可能需要调整):
-- 生成所有CREATE SEQUENCE语句 SELECT 'CREATE SEQUENCE ' + QUOTENAME(s.name) + '.' + QUOTENAME(seq.name) + ' ' + 'AS ' + TYPE_NAME(seq.system_type_id) + ' ' + 'START WITH ' + CAST(seq.start_value AS VARCHAR(MAX)) + ' ' + 'INCREMENT BY ' + CAST(seq.increment AS VARCHAR(MAX)) + ' ' + 'MINVALUE ' + ISNULL(CAST(seq.min_value AS VARCHAR(MAX)), 'NO MINVALUE') + ' ' + 'MAXVALUE ' + ISNULL(CAST(seq.max_value AS VARCHAR(MAX)), 'NO MAXVALUE') + ' ' + 'CYCLE ' + CASE WHEN seq.is_cycling = 1 THEN 'ON' ELSE 'OFF' END + ' ' + 'CACHE ' + CASE WHEN seq.is_cached = 1 THEN CAST(seq.cache_size AS VARCHAR(MAX)) ELSE 'OFF' END + ';' FROM sys.sequences seq JOIN sys.schemas s ON seq.schema_id = s.schema_id; -- 生成所有CREATE TABLE语句(基础结构,不含索引/约束等,需完善的话可以查系统视图) SELECT 'CREATE TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' (' + STRING_AGG(QUOTENAME(c.name) + ' ' + TYPE_NAME(c.system_type_id) + CASE WHEN c.is_nullable = 0 THEN ' NOT NULL' ELSE '' END, ', ') + ');' FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id JOIN sys.columns c ON t.object_id = c.object_id GROUP BY s.name, t.name; -- 生成所有INSERT语句(适用于小表,大表建议用bcp工具) DECLARE @TableName NVARCHAR(255); DECLARE table_cursor CURSOR FOR SELECT QUOTENAME(s.name) + '.' + QUOTENAME(t.name) FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id; OPEN table_cursor; FETCH NEXT FROM table_cursor INTO @TableName; WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'INSERT INTO ' + @TableName + ' SELECT * FROM ' + @TableName + ';'; FETCH NEXT FROM table_cursor INTO @TableName; END CLOSE table_cursor; DEALLOCATE table_cursor;
然后打开命令提示符,执行:
sqlcmd -S <你的服务器实例> -d <数据库名> -E -i "generate_backup.sql" -o "db_backup.sql"
-E:表示使用Windows集成认证,不用输账号密码-i:指定要执行的SQL脚本文件-o:指定输出的备份脚本文件名
2.2 SQL Server身份认证版本
把上面命令里的-E换成-U <用户名> -P <密码>就行:
sqlcmd -S <你的服务器实例> -d <数据库名> -U <用户名> -P <密码> -i "generate_backup.sql" -o "db_backup.sql"
小提示
- 如果是本地默认实例,
-S直接写localhost就行;命名实例记得加上实例名,比如localhost\SQLEXPRESS mssql-scripter还有很多进阶参数,比如排除特定对象、生成DROP语句等,输入mssql-scripter --help就能查看所有选项
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

