三、SQLServer 数据库安装集


一、Docker 安装


1. 创建容器

  • 前置准备
# 1. 创建`主机映射目录`
mkdir -p /root/sqlserver
# 2. 修改`主机映射目录权限`
chown -R 10001:0 /root/sqlserver

  • 创建容器
# 1、拉取`镜像`。
#sudo docker pull mcr.microsoft.com/mssql/server:2019-latest

# 阿里云拉取。
docker pull registry.cn-hangzhou.aliyuncs.com/newbe36524/server:2019-latest
# 重命名`镜像标签`。
docker tag registry.cn-hangzhou.aliyuncs.com/newbe36524/server:2019-latest mcr.microsoft.com/mssql/server:2019-latest

------------------------------------------------------------
# 2、启动`容器`。
docker run --name 'sqlserver_1' -p 1433:1433 \
	-e 'SA_PASSWORD=[密码:AAAbbb123]' \
    -e 'ACCEPT_EULA=Y' \
    -u 0:0 \
    -v '/root/sqlserver':'/var/opt/mssql' \
    -d ['镜像ID']

sudo docker run --name 'sqlserver_2' -p 1434:1433 \
	-e 'MSSQL_SA_PASSWORD=AAAbbb123' \
	-e 'ACCEPT_EULA=Y' \
	-v /root/sqlserver:/var/opt/mssql \
	-d 56beb1db7406
参数说明
-e ‘SA_PASSWORD=[密码:AAAbbb123]’设置 SQLServer 数据库 SA账号 的密码
-e ‘ACCEPT_EULA=Y’设置同意 SQLServer 数据库使用条款 , 否则无法使用
-e ‘MSSQL_PID=[产品序列号]’
–net=host

2. 脚本创建

# 容器ID。
cid='sqlserver_rs'

# 删除容器。
docker_rm() {
	sudo docker rm -f $cid
}

# 运行容器。
docker_run() {
	sudo docker run -d --name $cid -p 1433:1433 \
		-e 'MSSQL_SA_PASSWORD=AAAbbb123' \
		-e 'ACCEPT_EULA=Y' \
		'sqlserver'
	sleep 2
}

# 重启容器。
docker_restart() {
	sudo docker restart $cid
	sleep 2
}

# 拷贝备份文件。
docker_copy() {
	sudo docker cp /root/dam/uploadPath/upload/rs.bak $cid:/var/opt/mssql/
	sleep 2
}

# 备份文件还原(加`-it`报错`the input device is not a TTY`)。
docker_exec() {
	sudo docker exec $cid /opt/mssql-tools/bin/sqlcmd \
		-S 'localhost' -U 'SA' -P 'AAAbbb123' \
		-Q 'RESTORE DATABASE rs_new FROM DISK = "/var/opt/mssql/rs.bak" WITH MOVE "rs_new" TO "/var/opt/mssql/data/rs_new.mdf", MOVE "rs_new_log" TO "/var/opt/mssql/data/rs_new.ldf"'
	sleep 2
}

docker_rm
echo 'rm' = $?
docker_run
echo 'run' = $?
docker_copy
echo 'copy' = $?
docker_exec
echo 'exec' = $?
echo $?
  • the input device is not a TTY
  • 在重启过程中用 Shell脚本 去启动 Docker容器 并执行某一操作时,可能会出现如题所示错误,原因是后台linux执行的时候没有终端设备,TTY一词源于Teletypes,或teletypewriters。其实出现该错误和我们的一个习惯有关,一般来说我们启动容器后要与容器进行交互操作,这是,就要加上"-it"这个参数,而在重启过重中或定时任务中,如果让脚本在后台运行,就没有可交互的终端,这就会引发如题所示错误,解决办法就是去掉“-it”这个参数。
  • Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
  • Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.

二、操作


1. 连接数据库

在这里插入图片描述


2. 创建数据库

在这里插入图片描述


3. 常用 SQL

# 登录容器。
docker exec -it ['容器ID'] /opt/mssql-tools/bin/sqlcmd \
	-S localhost -U sa -P ['密码']
docker exec -it 'sqlserver_1' /opt/mssql-tools/bin/sqlcmd \
	-S localhost -U sa -P 'AAAbbb123'

# 还原数据库。
sudo docker exec -it 'sqlserver_1' /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P 'AAAbbb123' \
   -Q 'RESTORE DATABASE test FROM DISK = "/var/opt/mssql/test.bak" WITH MOVE "test" TO "/var/opt/mssql/data/test.mdf", MOVE "test_log" TO "/var/opt/mssql/data/test.ldf"'

sudo docker exec -it 'sqlserver_2019' /opt/mssql-tools/bin/sqlcmd 
	-S localhost \
   -U SA \
   -P 'AAAbbb123' \
   -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/rs.bak"' \
   | tr -s ' ' | cut -d ' ' -f 1-2

sudo docker cp '/root/sqlserver/test.bak' 'sqlserver_1:/var/opt/mssql/data\test.bak'

-- 备份。
BACKUP DATABASE [test]
TO
  DISK = N'/var/opt/mssql/data\test.bak'
WITH
  NAME = N'test - Backup',
  NOFORMAT, NOINIT, SKIP,
  STATS = 5

-- 还原。
RESTORE DATABASE [test] 
FROM
  DISK = N'/var/opt/mssql/data\test.bak'
WITH
  FILE = 1,
  RECOVERY,
  STATS = 5;

-- 查看数据库连接数。
SELECT COUNT(1) FROM
  [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT
  [DBID]
  FROM
  [Master].[dbo].[SYSDATABASES]
  WHERE  NAME='库名'
)
go

------------------------------------------------------------
select * 
from sysprocesses 
where dbid in (select dbid from sysdatabases where name='库名')
go

------------------------------------------------------------
SELECT u.id, u.name
FROM [test].[dbo].[user] u
go
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑士梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值