网站建设与运营市场风险什么是网络设计制作
2026/1/10 1:55:34 网站建设 项目流程
网站建设与运营市场风险,什么是网络设计制作,怀柔手机网站建设,开淘宝网店随着SQL Server在Linux平台的普及#xff0c;很多运维人员需要在Linux服务器上实现数据库日志的自动收缩。本文将原SQL脚本改造为适配Linux环境的Shell脚本#xff0c;兼容SQL Server 2017及以上Linux版本#xff08;2017/2019/2022#xff09;#xff0c;保留全版本适配、…随着SQL Server在Linux平台的普及很多运维人员需要在Linux服务器上实现数据库日志的自动收缩。本文将原SQL脚本改造为适配Linux环境的Shell脚本兼容SQL Server 2017及以上Linux版本2017/2019/2022保留全版本适配、安全合规、易维护的核心特性同时贴合Linux系统的操作习惯。一、完整Shell脚本#!/bin/bash# # 脚本名称sqlserver_shrink_log_job.sh# 适用环境Linux SQL Server 2017/2019/2022x64# 前置条件# 1. Linux服务器已安装SQL Server且启动sqlserver服务# 2. 已安装sqlcmd工具/opt/mssql-tools/bin/sqlcmd# 3. master库已创建dbo.ShrinkUser_DATABASESLogFile存储过程# 4. 执行脚本的Linux用户具备执行sqlcmd的权限# 核心功能在Linux的SQL Server中创建自动收缩日志的定时作业# 作者运维研发组# 日期2025-12-16# set-euo pipefail# Shell严格模式未定义变量报错、管道失败则脚本退出# 自定义配置参数根据实际需求修改 exportSQL_SERVERlocalhost# SQL Server实例地址本地填localhost远程填IP/主机名exportSQL_USERsa# SQL登录账户建议替换为低权限运维账户# 建议通过环境变量传入密码避免硬编码执行前执行export SQL_PWD你的密码# export SQL_PWDYourStrongPassword # 注释生产环境请勿直接写入脚本exportJOB_NAMEShrinkFile_DB_Logfile# 作业名称exportJOB_CATEGORYDatabase Maintenance# 作业分类exportSCHEDULE_NAMEShrink_DB_Logfile_Schedule# 调度名称exportDAILY_EXEC_TIME050000# 每日执行时间HHMMSS050000凌晨5点exportDELETE_EXIST_JOB1# 是否删除已存在的同名作业1删除0不删除exportNOTIFY_LEVEL2# 作业失败时记录事件日志0不记录2失败记录# 依赖检查 # 检查sqlcmd是否安装if!command-v /opt/mssql-tools/bin/sqlcmd/dev/null;thenecho【错误】未找到sqlcmd工具请先安装sudo apt-get install mssql-tools unixodbc-devDebian/Ubuntu或 sudo yum install mssql-tools unixODBC-develRHEL/CentOSexit1fi# 检查密码是否传入if[-z${SQL_PWD:-}];thenecho【错误】未设置SQL_PWD环境变量请执行export SQL_PWD你的SQL账户密码 后再运行脚本exit1fi# 检查SQL Server服务是否运行可选if!systemctl is-active --quiet mssql-server;thenecho【警告】SQL Server服务未运行建议先启动sudo systemctl start mssql-serverread-p是否继续执行脚本(y/n) -n1-rechoif[[!$REPLY~ ^[Yy]$]];thenexit1fifi# 构建TSQL脚本内容 TSQL_SCRIPT$(catEOF SET NOCOUNT ON;SET XACT_ABORT ON;-- 检查依赖的收缩存储过程是否存在 IF NOT EXISTS(SELECT1FROM master.sys.objects WHERE nameNShrinkUser_DATABASESLogFileANDtypeNPAND schema_idSCHEMA_ID(Ndbo))BEGIN RAISERROR(N前置条件不满足master库中未找到dbo.ShrinkUser_DATABASESLogFile存储过程,16,1);RETURN;END;-- 检查并处理已存在的同名作业 IF EXISTS(SELECT1FROM msdb.dbo.sysjobs WHERE nameN$JOB_NAME)BEGIN IF$DELETE_EXIST_JOB1BEGIN EXEC msdb.dbo.sp_delete_job job_nameN$JOB_NAME, delete_unused_schedules1;PRINT N已删除同名作业$JOB_NAME;END ELSE BEGIN RAISERROR(N作业【%s】已存在若需重新创建请将DELETE_EXIST_JOB设为1,16,1,N$JOB_NAME);RETURN;END END BEGIN TRY BEGIN TRANSACTION;-- 创建作业分类若不存在 IF NOT EXISTS(SELECT1FROM msdb.dbo.syscategories WHERE nameN$JOB_CATEGORYAND category_class1)BEGIN DECLARE ReturnCode INT0;EXEC ReturnCodemsdb.dbo.sp_add_category classNJOB, typeNLOCAL, nameN$JOB_CATEGORY;IF ReturnCode0BEGIN RAISERROR(N创建作业分类【%s】失败返回码%d,16,1,N$JOB_CATEGORY,ReturnCode);END PRINT N已创建作业分类$JOB_CATEGORY;END -- 创建核心作业 DECLARE JobId BINARY(16), ReturnCode INT0;EXEC ReturnCodemsdb.dbo.sp_add_job job_nameN$JOB_NAME, enabled1, notify_level_eventlog$NOTIFY_LEVEL, notify_level_email0, notify_level_netsend0, notify_level_page0, delete_level0, descriptionNLinux环境自动收缩用户数据库日志文件适配SQL Server Linux版依赖master.dbo.ShrinkUser_DATABASESLogFile存储过程, category_nameN$JOB_CATEGORY, owner_login_nameN$SQL_USER, job_idJobId OUTPUT;IF ReturnCode0BEGIN RAISERROR(N创建作业【%s】失败返回码%d,16,1,N$JOB_NAME,ReturnCode);END PRINT N已创建作业主体$JOB_NAME;-- 添加作业执行步骤 EXEC ReturnCodemsdb.dbo.sp_add_jobstep job_idJobId, step_nameNExecute_Shrink_Log_Procedure, step_id1, cmdexec_success_code0, on_success_action1, on_success_step_id0, on_fail_action2, on_fail_step_id0, retry_attempts0, retry_interval0, os_run_priority0, subsystemNTSQL, commandN BEGIN TRY PRINT N开始执行日志收缩存储过程 CONVERT(NVARCHAR(30), GETDATE(),120);EXEC master.dbo.ShrinkUser_DATABASESLogFile;PRINT N日志收缩存储过程执行完成 CONVERT(NVARCHAR(30), GETDATE(),120);END TRY BEGIN CATCH DECLARE ErrMsg NVARCHAR(4000)ERROR_MESSAGE();RAISERROR(N收缩日志失败%s,16,1,ErrMsg);END CATCH, database_name Nmaster, flags 0; IF ReturnCode 0 BEGIN RAISERROR(N添加作业步骤失败返回码%d,16,1,ReturnCode); END PRINT N已添加作业执行步骤; -- 配置作业调度 EXEC ReturnCode msdb.dbo.sp_add_jobschedule job_id JobId, name N$SCHEDULE_NAME, enabled 1, freq_type 8, freq_interval 127, freq_subday_type 1, freq_subday_interval 0, freq_relative_interval 0, freq_recurrence_factor 1, active_start_date CONVERT(INT, REPLACE(CONVERT(VARCHAR(10), GETDATE(), 112), -, )), active_end_date99991231, active_start_time$DAILY_EXEC_TIME, active_end_time235959;IF ReturnCode0BEGIN RAISERROR(N配置作业调度失败返回码%d,16,1,ReturnCode);END PRINT N已配置作业调度每日$DAILY_EXEC_TIME执行;-- 关联作业到本地服务器Linux下SQL Server实例默认名为MSSQLSERVER EXEC ReturnCodemsdb.dbo.sp_add_jobserver job_idJobId, server_nameN(local);IF ReturnCode0BEGIN RAISERROR(N关联作业到服务器失败返回码%d,16,1,ReturnCode);END PRINT N已将作业关联到本地服务器;COMMIT TRANSACTION;PRINT N;PRINT N作业【$JOB_NAME】创建成功;PRINT N;END TRY BEGIN CATCH IF TRANCOUNT0ROLLBACK TRANSACTION;DECLARE ErrorMessage NVARCHAR(4000)ERROR_MESSAGE(), ErrorSeverity INTERROR_SEVERITY(), ErrorState INTERROR_STATE();RAISERROR(N创建作业失败%s,ErrorSeverity,ErrorState,ErrorMessage);END CATCH SET NOCOUNT OFF;EOF)# 执行TSQL脚本 echo【信息】开始执行TSQL脚本创建自动收缩日志作业.../opt/mssql-tools/bin/sqlcmd -S$SQL_SERVER-U$SQL_USER-P$SQL_PWD-Q$TSQL_SCRIPT# 检查执行结果if[$?-eq0];thenecho【成功】作业创建脚本执行完成echo【提示】可通过以下命令查看作业echo /opt/mssql-tools/bin/sqlcmd -S$SQL_SERVER-U$SQL_USER-P$SQL_PWD-Q SELECT name, enabled FROM msdb.dbo.sysjobs WHERE name N$JOB_NAME;echo【提示】查看作业执行历史echo /opt/mssql-tools/bin/sqlcmd -S$SQL_SERVER-U$SQL_USER-P$SQL_PWD-Q EXEC msdb.dbo.sp_help_jobhistory job_name N$JOB_NAME;elseecho【错误】作业创建脚本执行失败exit1fi二、使用步骤1. 前置准备确保Linux服务器已安装SQL Server并启动服务安装sqlcmd工具Debian/Ubuntusudo apt-get update sudo apt-get install -y mssql-tools unixodbc-devRHEL/CentOSsudo yum install -y mssql-tools unixODBC-devel在master库创建dbo.ShrinkUser_DATABASESLogFile存储过程核心收缩逻辑创建低权限SQL运维账户可选替代sa。2. 脚本部署与执行# 1. 将脚本保存为sqlserver_shrink_log_job.shvimsqlserver_shrink_log_job.sh# 2. 添加执行权限chmodx sqlserver_shrink_log_job.sh# 3. 设置SQL密码环境变量关键避免硬编码exportSQL_PWD你的SQL账户密码# 4. 执行脚本./sqlserver_shrink_log_job.sh3. 验证作业创建结果# 查看创建的作业/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P$SQL_PWD-QSELECT name, enabled FROM msdb.dbo.sysjobs WHERE name NShrinkFile_DB_Logfile;# 手动执行作业测试/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P$SQL_PWD-QEXEC msdb.dbo.sp_start_job job_name NShrinkFile_DB_Logfile;# 查看作业执行历史/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P$SQL_PWD-QEXEC msdb.dbo.sp_help_jobhistory job_name NShrinkFile_DB_Logfile;三、重要注意事项1. 安全规范禁止硬编码密码永远不要将SQL密码直接写入脚本通过环境变量或配置文件传入最小权限原则避免使用sa账户创建专门的运维账户授予SQLAgentOperatorRole、db_ownermaster库等最小权限脚本权限限制脚本的读取权限chmod 700 sqlserver_shrink_log_job.sh避免密码泄露。2. 性能与业务风险收缩日志的适用场景仅用于日志异常增长的应急场景不要作为常规运维手段完整恢复模式处理若数据库为完整恢复模式需在收缩前执行日志备份BACKUP LOG否则收缩无效避免碎片化频繁收缩会导致日志文件碎片化建议收缩后调整日志文件的自动增长规则如按固定大小增长而非百分比。3. 运维监控定期检查作业执行历史确认收缩逻辑正常运行监控数据库日志文件大小从根源解决增长问题如优化长事务、调整恢复模式、配置定时日志备份Linux下可通过cron定时检查作业状态可选。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询