Docker 运行 Sql Server 2017
后台运行 Sql Server:
# -d 后台运行
# --restart always 开机自启动
# -v sqlserver-data:/var/opt/mssql/data/ 持久化到 volume 中
# -e "MSSQL_COLLATION=Chinese_PRC_CI_AS" 中文字符集
# -e "ACCEPT_EULA=Y" 必须同意条款,否则无法安装
# -e "SA_PASSWORD=your_password" 密码,sa的密码
# -p 1433:1433 端口映射,左边是服务器的端口,右边是容器的端口
#
docker run -d --restart always --name sqlserver -v sqlserver-data:/var/opt/mssql/data/ -e "MSSQL_COLLATION=Chinese_PRC_CI_AS" -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=your_password" -p 1433:1433 mcr.microsoft.com/mssql/server:2017-latest
查看日志:
# -f:日志跟随
docker logs sqlserver -f
从文件还原数据库
还原(替换)test
数据库,生产环境谨慎使用:
# 0. 先复制数据到容器内
docker cp test.bak sqlserver:/
# 1. 先进入容器
docker exec -it sqlserver bash
# 2. 容器内执行。
# /dir/test.bak 目录是指容器的目录
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -Q "RESTORE DATABASE test FROM DISK='/test.bak' WITH REPLACE"
# WITH REPLACE 表示替换掉原来的数据库
执行 sql
容器内执行
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'password' -d your_database -i your_sql.sql
常见错误
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_PRC_CI_AS" in the equal to operation.
这是因为系统没人的collation跟某一列的collation不一致导致的,要么修改列的collation,要么修改表的collation,要么修改整个数据库的collation,
或者把数据库的collation改成一样的。
常见的查看 collation sql:
-- 查看一个表的所有列的collation
SELECT
col.name, col.collation_name
FROM
sys.columns col
WHERE
object_id = OBJECT_ID('test')
--查看数据库的collation
SELECT name, collation_name
FROM sys.databases
WHERE name = 'test';
-- 查看数据库默认的collation
SELECT CONVERT (varchar, SERVERPROPERTY('collation'));