如何在 PostgreSQL 9.1 中设置两台相同的服务器以进行自动故障转移。
操作系统
Centos 5
PostgreSQL 9.1 源码编译
postgres 用户账号存在于两台机器上,并且有一个 ssh 无密码密钥,可以连接两台机器。
我当前的设置:
主服务器配置:
postgresql.conf:
listen_address = '*'
wal_level = hot_standby
max_wal_senders = 3
checkpoint_segments = 16
wal_keep_segments = 8
archive_mode = on
archive_command = 'cp "%p" /opt/pgsql91/archive/"%f"'
Run Code Online (Sandbox Code Playgroud)
pg_hba.conf:
host replication all 10.0.66.1/32 trust
host replication all 10.0.66.2/32 trust
Run Code Online (Sandbox Code Playgroud)
备用服务器
postgresql.conf 和 pg_hba.conf 与主服务器上配置的相同。
恢复.conf:
standby_mode = 'on'
primary_conninfo = 'host=10.0.66.1'
trigger_file = '/opt/pgsql91/data/trigger.txt'
Run Code Online (Sandbox Code Playgroud)
感谢 hzRoot,我现在明白了如何将服务器从备用服务器切换到主服务器。
使用以下命令,我可以将新从站与新主站同步,然后获取复制备份并运行。
在新主 (10.0.66.2) 上
使用 SQL Server 2008 R2 企业版
考虑以下语句:
:setvar source_server_name "SERVERNAME\INSTANCENAME"
Run Code Online (Sandbox Code Playgroud)
是否可以在 SQLCMD 模式下使用 TSQL 获取该值
就像是: :setvar source_server_name = SELECT @@servername
谢谢
2013 年 7 月 15 日更新
下面提供的两个答案并没有给出理想的结果,所以我添加了一个更相关的例子。
:setvar source_server_name [myserver]
Run Code Online (Sandbox Code Playgroud)
变量 source_server_name 设置为文本字符串 [myserver_1]
我希望能够做到这一点:
create table #tmp(
id int identity(1,1),
server sysname
)
insert into #tmp values('myserver_1'),('myserver_2');
:setvar source_server_name = SELECT server FROM #tmp WHERE id = 1
select '$(source_server_name)'
(No column name)
myserver_1
Run Code Online (Sandbox Code Playgroud)
变量 source_server_name 将设置为 ID 1 的服务器中的值。
我正在比较 SQL Server 2012 中的两个查询。目标是在选择最佳查询时使用查询优化器提供的所有相关信息。两个查询产生相同的结果;所有客户的最大 orderid。
在使用 FREEPROCCACHE 和 DROPCLEANBUFFERS 执行每个查询之前清除缓冲池
使用下面提供的信息,哪个查询是更好的选择?
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
Run Code Online (Sandbox Code Playgroud)
统计时间
查询 1 STATISTICS TIME:CPU 时间 = 0 毫秒,经过时间 …
SQL Server 2008 SP3
如何追踪这些超时错误?

错误显示在专门用于 IIS 中的错误报告的 Intranet 仪表板上。我怀疑 Web 应用程序中的默认超时时间为 30 秒,如果查询时间超过 30 秒,则会引发异常。由于在这些 SQL 服务器上有许多查询需要超过 30 秒的时间,因此我不能仅根据持续时间在探查器中进行过滤。
为这个仪表板监控的网站提供服务的是两台 IIS 服务器,它们从七个 SQL Server 实例中检索数据。
我可以使用“用户错误消息事件”和“OLEDB 错误事件”来跟踪 SQL Server Profiler 中的这些错误吗?
考虑以下查询:
MERGE [Parameter] with (rowlock) AS target
USING (SELECT @AreaId, @ParameterTypeId, @Value)
AS source (AreaId, ParameterTypeId, Value)
ON (target.AreaId = source.AreaId AND
target.ParameterTypeId = source.ParameterTypeId)
WHEN MATCHED THEN
UPDATE SET target.Value = source.Value, @UpdatedId = target.Id
WHEN NOT MATCHED THEN
INSERT ([AreaId], [ParameterTypeId], [Value])
VALUES (source.AreaId, source.ParameterTypeId, source.Value);
Run Code Online (Sandbox Code Playgroud)
统计 I/O 提供以下输出:
表“参数类型”。扫描计数 0,逻辑读取 2,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
表 'Area'。扫描计数 0,逻辑读取 2,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
表“参数”。扫描计数 1,逻辑读取 4,物理读取 0,预读读取 0,lob 逻辑读取 …
在具有足够 RAM 和快速磁盘的 SQL Server 2014 实例上,有 160 多个用户可以访问数据库。出于某种我不知道的原因,DROP USER [username]在这个数据库中运行命令每个用户最多需要 5 秒。
将用户重新映射到登录并恢复他们的权限非常快。
在从生产中刷新 DEV 数据库的上下文中,我必须删除并重新创建所有数据库用户。所以是的,删除数据库用户并重新创建它们是必要的。
DROP USER命令?请记住,对于我正在编写的实例,我必须运行它超过 160 次。
这是我正在使用的 SQL:
DECLARE drop_user_cur CURSOR FOR
SELECT name FROM #drop_users
OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
BEGIN TRY
print @sql
EXECUTE(@sql)
END TRY
BEGIN CATCH
print 'ERREUR : ' + @sql …Run Code Online (Sandbox Code Playgroud) 我有一个在 CentOS 5.8 32 位操作系统上运行的 PostgreSQL 9.1 服务器,并且我启用了 WAL 归档。在这台服务器上,有三个数据库:databaseA、databaseB和databaseC。有人在下午 12 点在 databaseB 上删除了一个表,我想将 databaseB 恢复到该表被删除的时间之前。现在时间是下午 3 点。
如何在不丢失其他两个数据库中三个小时的数据的情况下将 databaseB 恢复到下午 12 点?
配置文件
wal_level = archive
archive_mode = on
archive_command = 'test ! -f /opt/pgsql/logs/%f && cp %p /opt/pgsql/logs/%f'
max_wal_senders = 100
Run Code Online (Sandbox Code Playgroud)
恢复配置文件
restore_command = 'cp /opt/pgsql/logs/%f %p'
recovery_target_time = '2012-06-29 11:59:59 CEST'
Run Code Online (Sandbox Code Playgroud)
我在上午 9 点运行了我的基本备份
pg_basebackup -h 127.0.0.1 -D /opt/pgsql/backup
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 服务在下午 3 点关闭。
在装有 SQL Server 2014 Enterprise 的群集 Windows 2012 R2 服务器上。
刚刚将一个实例从 2014 SP1 CU4 升级到 2016 RTM,现在在尝试启动 SQL Server 代理时出现此错误。
2016-06-06 11:53:58 - ? [100] Microsoft SQLServerAgent version 13.0.1601.5 (X64 unicode retail build) : Process ID 10884
2016-06-06 11:53:58 - ? [495] The SQL Server Agent startup service account is DOMAIN\USERNAME.
2016-06-06 11:54:28 - ! [150] SQL Server does not accept the connection (error: 65535). Waiting for Sql Server to allow connections. Operation attempted was: Verify Connection …Run Code Online (Sandbox Code Playgroud) 在 Windows 2008 64 位上运行的 SQL Server 2008 R2 RTM。
使用以下命令备份单个数据库时出现问题
backup database [somedatabase]
to disk = '\\somehost\d$\BACKUP\somedirectory\some_database.bak'
with compression, init, stats=1
Run Code Online (Sandbox Code Playgroud)
数据库备份了一段时间就好了
93 percent processed.
94 percent processed.
Run Code Online (Sandbox Code Playgroud)
然后我收到有关磁盘空间的错误
消息 3202,级别 16,状态 1,第 1 行
写入“\somehost\d$\BACKUP\somedirectory\some_database.bak”失败:1130(没有足够的服务器存储空间来处理此命令。)
消息 3013,级别 16,状态 1,第 1 行
BACKUP DATABASE 异常终止。
这没有任何意义,因为有超过 800GB 的可用磁盘空间,而备份使用的是 121GB。
在 SQL Server 的日志中,我收到此消息
Date 9/25/2013 1:04:56 PM
Log SQL Server (Current - 9/25/2013 12:15:00 PM)
Source Backup
Message
BackupIoRequest::ReportIoError: write failure on backup device
'\\somehost\d$\BACKUP\somedirectory\some_database.bak'. Operating
system error 1130(Not …Run Code Online (Sandbox Code Playgroud) 我被要求确定存储过程的权限问题。根据用于其参数的值,此存储过程以两种可能的方式运行。
exec ps_my_stored_procedure @a=1, @b=2, @c=3
Run Code Online (Sandbox Code Playgroud)
处理方式与
exec ps_my_stored_procedure @a=5, @b=7, @c=0
Run Code Online (Sandbox Code Playgroud)
您可以说这ps_my_stored_procedure在逻辑上分为两个完全独立的过程。
使用dm_exec_procedure_stats和dm_exec_query_stats,我可以找到显示所使用存储过程的 SQL 的执行计划。但是,我无法恢复参数的定义方式和值。
是否可以使用dm_exec_procedure_stats和dm_exec_query_stats和任何其他管理视图来重建存储过程的执行,以显示用于其参数的值。
我真正想要的是在缓存中找到存储过程的实际执行,以便我可以执行它EXECUTE AS LOGIN = 'someone'来解决权限问题
sql-server ×7
backup ×2
postgresql ×2
connectivity ×1
failover ×1
performance ×1
recovery ×1
security ×1
sqlcmd ×1
t-sql ×1
upgrade ×1