当我使用 MySQL 时,我可以运行一个命令,将 SSH 连接到我的服务器并将数据库复制到我的本地机器上。
ssh -t remoteserver 'mysqldump --compress -u dbuser --password="password" db_name' | /usr/local/mysql/bin/mysql -u root --password="password" local_db_name
Run Code Online (Sandbox Code Playgroud)
我如何用 PostgreSQL 做同样的事情?
我的问题与以下两个实例的实验有关:
SQL Server 2017 Express 实例 (Microsoft SQL Server 2017 (RTM-CU16))
SQL Server 2014 Express 实例 (Microsoft SQL Server 2014 (SP2-CU18))
我使用函数ENCRYPTBYPASSPHRASE来加密文本并将结果用作 DECRYPTBYPASSPHRASE 的@ciphertext。我的测试结果如下:
根据这个微软修复,
[...] SQL Server 2017 使用 SHA2 散列算法来散列密码。SQL Server 2016 和更早版本的 SQL Server 使用不再被视为安全的 SHA1 算法。
但是,如果函数 DECRYPTBYPASSPHRASE 上没有与此相关的参数,它如何知道用于加密数据的算法是什么?它是加密数据的一部分吗?
根据我的测试结果,我猜 SQL Server 总是使用实例上可用的较新版本的算法来加密数据,但会尝试所有算法来解密数据,直到找到适合的算法或在找不到相应算法时返回 NULL . 这只是一个猜测,因为我找不到任何方法来检查 SQL Server 用于解密加密数据的散列算法。
查询优化器创建多个可能的执行计划。如何查看在选择执行的计划之前生成的所有计划?
微软说:
查询优化器必须分析可能的计划并选择估计成本最低的计划。
请注意,我不是在谈论执行计划缓存和重用,我在谈论候选执行计划,即生成但未选择执行的执行计划。
根据 Benjamin Nevarez 的文章SQL Server 查询优化器:
候选执行计划的生成在查询优化器内部使用转换规则执行,启发式的使用限制了考虑的选择数量,以保持优化时间合理。候选计划在优化期间存储在内存中,称为备忘录的组件中。
是否有可能以显示实际执行计划的方式呈现候选计划?
愿意解决这个问题涉及到一个错误的值对is_media_read_only数据库属性我做了一些研究和试验,但最终我不能梳理一下究竟触发列的更新is_media_read_only上sys.database_files。
根据sys.database_files文档,该列is_media_read_only应具有以下两个可能值之一:
1 = 文件位于只读媒体上。
0 = 文件在读写介质上。
有了这些信息,我对两个不同版本的 SQL Server 进行了以下实验:
Microsoft SQL Server 2014 (SP3-GDR) (KB4505218) - 12.0.6108.1 (X64)
Microsoft SQL Server 2017 (RTM-CU16) (KB4508218) - 14.0.3223.3 (X64)
在我的笔记本(驱动器 E:) 中插入一个笔式驱动器并创建一个数据库,如下所示:
CREATE DATABASE [MyDB]
ON PRIMARY
( NAME = N'MyDB_01', FILENAME = N'D:\DataBases\MyDB_01.mdf'),
FILEGROUP [SECONDARY]
( NAME = N'MyDB_02', FILENAME = N'E:\DataBasesPendrive\MyDB_02.ndf')
LOG ON
( NAME = N'MyDB_log', FILENAME = N'D:\DataBases\MyDB_log.ldf')
GO
Run Code Online (Sandbox Code Playgroud)
查询 sys.database_files: …
据我所知,SQL Server系统数据库总是具有相同的 ID,而且我在 Internet 上看到许多维护脚本依赖谓词WHERE database_id > 4将它们从脚本的操作中排除。
另外,如果我SELECT name, schema_id FROM sys.schemas;在新的用户数据库上运行,我会得到:
name schema_id
dbo 1
guest 2
INFORMATION_SCHEMA 3
sys 4
db_owner 16384
db_accessadmin 16385
db_securityadmin 16386
db_ddladmin 16387
db_backupoperator 16389
db_datareader 16390
db_datawriter 16391
db_denydatareader 16392
db_denydatawriter 16393
Run Code Online (Sandbox Code Playgroud)
我在两个不同的实例上运行了该查询,一个是 SQL Server 2016,另一个是 SQL Server 2005,并且都返回了相同的结果。
在阅读了一篇日期为2012年的关于未记录的函数fn_dblog 和 fn_dump_dblog的文章后,我想知道如果它们已经存在很长时间并且非常有用,为什么它们仍然未记录且不受支持。与这篇2004 年的sp_msforeachtable 和 sp_msforeachdb文章相同。
我可以从其中一个回答论坛上的问题中受益(在日志备份期间是将数据备份到操作开始还是结束?),但我想知道为什么它们随 SQL Server 一起提供直到现在,以未记录和不受支持的方式。
我知道有人说他们不可靠,但如果这是唯一的原因,他们本可以在 16 年内得到纠正。所以一定有另一种解释。
用户(Windows 登录)刚刚抱怨他被拒绝执行程序。我去检查并确认他有执行它的权限。我没有改变任何东西(现在我是唯一一个拥有管理员权限的人,如果需要的话),在两次尝试失败后,他尝试第三次运行 SP 并且成功了。
我将 XE 配置为捕获错误消息,它捕获了错误代码 229 的两倍:
对象“storedProcedureName”、数据库“databaseName”、架构“schemaName”的 EXECUTE 权限被拒绝。
是否存在预期这种行为的任何情况?
Microsoft SQL Server 2014 (SP3-CU-GDR) (KB4535288) - 12.0.6372.1 (X64)
我们的 ERP 系统存在一些性能问题。06:00 左右,问题开始出现。长话短说; 我的一位同事执行了DBCC FREEPROCCACHE(我知道这不是首选操作,但这不是重点)。之后,他重新启动了整个 ERP 应用程序,而不是数据库引擎。这似乎没有帮助。我查看了查询存储,发现查询计划在 06:05 左右发生了更改。我尝试强制执行旧计划,性能问题就消失了。
我比较了 2 个计划 XML,发现两者都基于相同的统计数据(更新日期完全相同)。索引上的更改数量不同,但这不会触发更新统计信息,因为否则新的查询计划将为所使用的统计信息提供新的日期。我检查了涉及的表的所有统计信息,但自上次维护工作以来,它们没有更新。最后一次维护作业在本周末运行,这也是两个查询计划中使用的统计信息的更新日期。
该查询是参数化查询,所以我有点不清楚为什么查询计划突然改变。我认为恰恰相反,查询突然运行缓慢,因为相同的计划用于不同的参数。这里的情况似乎并非如此,因为我强制使用旧的查询计划。
该查询来自一些检索订单的定制工作。现在,我怀疑有人发出了参数化查询,该查询会返回一个非常大的数据集,从而减慢 ERP 系统的速度。然后,我的同事运行了一个DBCC FREEPROCCACHE命令,根据本周末的新统计数据触发了查询计划的重新编译。当前查询继续运行,他决定重新启动 ERP 应用程序。现在,使用新的查询计划,所有新查询都会变慢,直到我强制使用旧的查询计划。
这能是解释吗?我有点怀疑,因为当统计数据发生变化时,SQL Server会触发重新编译,所以计划应该在索引维护作业之后已经重新编译。
我想我在这里遗漏了一些东西,但我不确定是什么。它是SQL Server 2016 Standard,是ERP系统的专用服务器。
编辑 15-4-2020 12:17:既然我写了这个...我认为问题在于DBCC FREEPROCCACHE第一次执行有问题的参数化查询的参数使用了不同的参数,这导致 SQL Server 重新编译(坏)计划。或者我还缺少什么吗?
我有一张每天插入和删除的表。平均记录数为 80,000。大约 20 个字段,其中 10 个是 VARCHAR(4000) 但是大多数记录的这些字段为空。1 个 NC 索引占 8MB。
加载此表的作业按预期运行,没有性能问题。
该表每天缓慢增长 1GB,最小记录数增加(有时会减少)。我似乎无法指出是什么导致了这种情况。任何帮助是极大的赞赏!
sql-server ×9
optimization ×2
encryption ×1
errors ×1
functions ×1
objectid ×1
permissions ×1
postgresql ×1
storage ×1