目录
1.背景
2.Linux安装sql server
3.服务器不开端口的问题
4.数据库导入导出问题
1.背景
博主在24年年底接手运维了一个政府的老系统,整个应用和数据库单点部署在一台Windows Server服务器上,数据库选型是经典的老项目标配——sql server。随着近两年政府部门对信息系统的规范管理,开始建设各个地区的中心机房,用来集中统一部署各类政府系统。也伴随着软件国产化改革的深入,或者准确的说伴随着“信创”的展开和深入,开始纷纷要求中心机房的操作系统等基础设施国产化。原先系统开发的各个厂商需要配合政府部门完成原来老系统迁移部署到中心机房的国产化操作系统的服务器上这个全过程。博主碰见的就是要将Windows server上部署的应用和数据库迁移到中心机房的“统信”服务器上的这一要求。
应用无非就是JAVA开发的后端、前端框架开发的前端,配套需要的一些基础环境无非是nginx、redis。java作为跨平台语言迁移起来是很平滑的,前端也不存在跨平台的问题,nginx和redis在Linux上的部署也很简单,博主之前有文章单独说过。整个过程中最麻烦的就是sql server从windows server迁移到Linux(统信系统本身就是Linux)上的这个过程。这个过程应该是极具借鉴意义的,其中遇见的问题估计在toB的这种服务器迁移中是很常见的,所以特此记录下来。
遇见的问题有:
- Linux上安装sql server
- 服务器不开端口的问题
- 数据库导出/导入问题
2.Linux安装sql server
sql server作为微软推出的一款数据库,本身就是为了Windows而生的,要在Linux上安装sql server,解决方案,博主还是找了好些才找到一个可行方案,而且简单易用,确认可行:
Linux下安装SQL Server 2016(安装篇SQL Server on linux)_sql2016 linux下载-CSDN博客
3.服务器不开端口的问题
做过政府或者大企业项目的都知道,这类客户的中心机房的服务器端口管理特别严格,要开端口要跑的流程特别繁琐,甚至很多时候就拒接开端口,把ping之类的全部都禁掉。一般也就会允许开一个原创的命令行窗口去操作服务器,允许上传下载文件,对外暴露几个应用部署后哦需要的访问端口,比如网站部署后的80端口。
不开端口会带来一个很麻烦的问题:没办法用数据库工具访问到远端服务器上的数据库。只能在命令行窗口里通过基础的命令来操作数据库。
sql server在Windows上自带有自己的管理控制台工具来访问,在Linux上如何访问喃?
答案:用sqlcmd。
以下是安装步骤。
1.首先根据自己的版本去找到对应的源:
sudo curl -o /etc/yum.repos.d/mssql-tools.repo https://packages.microsoft.com/config/rhel/7/prod.repo
2.清理和刷新yum:
sudo yum clean all
sudo yum makecache
3.安装:
yum install -y mssql-tools unixODBC-devel
4.确认路径在哪儿:
ls /opt/mssql-tools/bin
5.配置环境变量
export PATH=$PATH:/opt/mssql-tools/bin
6.连接数据库:
sqlcmd -S 数据库的IP -U 用户名(一般是sa作为管理员) -P 密码(注意用前后单引号引起来);
注意:通过sqlcmd连接数据库后,执行的命令后面回车然后加上GO,前面输入的命令才会被提交执行。
4.数据库导入导出问题
估计大家都有一样的体感,每次进行数据库迁移的时候最麻烦的一道坎就是数据的导入导出问题,经常出现备份出来的文件,转头放到要部署到的目标服务器的时候导入还原不到了,各种问题,各种报错。建立了好几次迁移任务后,博主总结出来的:
最好就导出成create的建表语句和insert的数据插入语句,执行这种sql是失败率最低的,即使失败了去调整一下sql就是了。
博主是用的:
当然市面上的数据库连接工具太多了,选一个趁手的导出DDL和insert就行。导出很简单,问题是如何导入到上面说的不开放端口的远端服务器上?肯定是不可能一条一条sql执行的,量那么大。将导出整理好后的sql文件上传到服务器上,然后通过sqlcmd来批量执行写入指定库中才是正解:
sqlcmd -S 数据库的IP -U 用户名(一般是sa作为管理员) -P 密码(注意用前后单引号引起来)-d 数据库名称 -i sql脚本路径;
最后还有个问题就是肯定不可能用sa这种超级管理员账户去在JAVA中访问数据库,所以要给数据库建一个专门的用户,在sqlcmd中执行以下操作:
-- 切换到目标数据库
USE TestDB;
GO-- 创建一个登录账号
CREATE LOGIN app_user WITH PASSWORD = 'StrongPassword123';-- 创建一个数据库用户并映射到登录账号
CREATE USER app_user FOR LOGIN app_user;-- 授予读写权限
ALTER ROLE db_datareader ADD MEMBER app_user;
ALTER ROLE db_datawriter ADD MEMBER app_user;
GO
如果上面建立的用户连接数据库还报错,可以通过命令去验证一下用户对指定的数据库是否有访问权限,示例:
sqlcmd -S 127.0.0.1,1433 -U penge -P 'penge2024#' -d Ps_CostInfoSite
如果没有权限就重新加一下,示例:
USE Ps_CostInfoSite;
GO
CREATE USER penge FOR LOGIN penge;
GO
ALTER ROLE db_owner ADD MEMBER penge;
GO