这两天公司的服务器需要做一些迁移,正好我有理由把几的MSSQL老项目彻底Linux化了。
原来的几个老项目的数据库是在Windows上跑的,数据库是MSSQL2012。我准备将它迁移到MSSQL for Linux上,服务部署在Docker容器里。
下面是我的操作步骤:
1、拉取镜像
docker pull mcr.microsoft.com/mssql/server:2019-latest
2、启动实例
docker run -d --restart=always \
--name mssql-server \
--hostname mssql2019 \
--shm-size 1g \
-it -m 2048M \
-p 1433:1433 \
-e 'ACCEPT_EULA=Y' \
-e 'MSSQL_SA_PASSWORD=MyPass12345#' \
-e 'TZ=Asia/Hong_Kong' \
-v db:/var/opt/mssql \
mcr.microsoft.com/mssql/server:2019-latest
特别说明:
- Windows自古MSSQL都是吃内存的大户,多少内存都会被他用到仅剩90%。所以为了不影响我的其他应用资源,特意加了
-it -m 2048M
,把内存使用上线限定在2G以内,也达到官方推荐的最低内存标准了。 - 为了数据能持久化,重启Docker实例不会被抹掉,我们需要增加卷,这个玩惯Docker都很熟悉。但是,这里有个坑!本地Volume只能用相对路径:
db:/var/opt/mssql
。如果用了绝对路径,例如:/var/docker/mssql/db:/var/opt/mssql
,不好意思,会报错!相对路径Volume的实际路径会跑到这里/var/lib/docker/volumes/db
,做个软链接。这样就容易找了:ln -sf /var/lib/docker/volumes/db/_data ./db
3、还原数据库
- 创建备份目录
docker exec -it mssql-server mkdir /var/opt/mssql/backup
- 复制备份文件
docker cp main_db.bak mssql-server:/var/opt/mssql/backup
- 执行还原SQL脚本
RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/main_db.bak';
RESTORE DATABASE bwyv1_scp_db FROM DISK = '/var/opt/mssql/backup/main_db.bak'
WITH MOVE 'main_db' TO '/var/opt/mssql/data/main_db.mdf',
MOVE 'main_db_log' TO '/var/opt/mssql/data/main_db_log.ldf';
- 创建登录账号
CREATE LOGIN [testuser] WITH PASSWORD = 'test123456', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_DATABASE = [main_db]
GO
- 设置数据库owner
USE [main_db]
GO
DROP USER [testuser]
GO
CREATE USER [testuser] FOR LOGIN [testuser]
GO
EXEC sp_addrolemember N'db_owner', N'testuser'
GO
4、备份数据库
-- 定义备份文件的路径和名称
DECLARE @backupPath NVARCHAR(256);
SET @backupPath = '/var/opt/mssql/backup/main_db_backup_' + CONVERT(NVARCHAR(20), GETDATE(), 112) + '.bak';
-- 执行完整备份
BACKUP DATABASE main_db
TO DISK = @backupPath