我正在设置一个实验,其中我在服务器上只有证书的公钥部分。证书是在另一台服务器上生成的,我没有恢复私钥。
当我尝试使用该证书使用加密备份数据库时,出现此错误:
Msg 15556, Level 16, State 1, Line 15
Cannot decrypt or encrypt using the specified certificate, either because it has no private key or because the password provided for the private key is incorrect.
Msg 3013, Level 16, State 1, Line 15
BACKUP DATABASE is terminating abnormally.
Run Code Online (Sandbox Code Playgroud)
那是 SQL Server 清楚地告诉我它需要私钥进行加密。
但这是为什么呢?
我的理解是 BACKUP 生成对称密钥,使用证书中的公钥保护对称密钥,并将其与备份内容一起存储。然后使用对称密钥来加密实际的备份内容,因为对称加密通常(总是?)比非对称加密快。
为了恢复备份,我需要与加密中使用的公钥相对应的私钥。这是预期的。
我只是不明白为什么在备份操作期间需要私钥。没有在文档或其他任何地方找到答案。有人可以解释一下或指出一些关于为什么会这样的文件吗?
我有一个带有聚集列存储索引的简单表:
ID INT NOT NULL,
Hash BINARY(20) NOT NULL
Run Code Online (Sandbox Code Playgroud)
此表有一些十亿行和根据sp_spaceused,sys.allocation_units并SSMS报告,其大小约为25GB。
我的问题是我无法解释所有这些空间。查询sys.column_store_row_groups并且sys.column_store_segments只给我大约 7,8GB。索引不使用字典:primary_dictionary_id并且secondary_dictionary_id对于所有段都是 -1。查询sys.column_store_dictionaries根本不返回任何行。
元组移动器已完成其工作,所有行组都处于压缩状态。我已经试过了ALTER INDEX REORGANIZE以防万一。
我对大小差异的唯一想法是一些我没有考虑的类似字典的东西。关于我可能缺少什么的任何想法?
我正在运行 SQL Server 2017 (RTM-CU4)。
编辑 1:
这是 sp_spaceused 用于相关表的输出:
+--------+------------+-------------+-------------+------------+----------+
| name | rows | reserved | data | index_size | unused |
+--------+------------+-------------+-------------+------------+----------+
| IdsBin | 1073741824 | 25028112 KB | 25007432 KB | 16 KB | 20664 KB |
+--------+------------+-------------+-------------+------------+----------+
Run Code Online (Sandbox Code Playgroud)
编辑2:
这是一个包含 100 万行的复制脚本。它在我的机器上运行大约 …