我们的 OLTP 日志系统的其中一个表中的 ID 即将用完。我的工作是找到一种方法来“归档”完整表和所有引用表中的现有行数据,以便我们可以继续将新数据记录到表中。
我们在一个表中归档数据的最快方法是简单地重命名目标表和所有依赖对象——联结表、索引、约束。它速度很快,并且可以保持数据完整。为了完成这项工作,我们必须使用旧名称创建所有对象的新的空副本。如果我们在一个事务中完成所有这些操作,插入新数据的存储过程不会因为缺少表而失败。
我已经整理了一个 PowerShell 脚本来生成一个 T-SQL 脚本来执行存档操作。
该脚本没有生成应有的重命名语句,我不明白为什么。
该脚本加载 SMO,设置目标对象的名称,并设置到服务器的仅捕获连接 - 这样我就可以捕获重命名命令以供稍后检查:
Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
$ServerName = 'CLOUDCORP\LOGGING'
$DatabaseName = 'Logging'
$TableName = 'tbDataRequests'
$TableSchemaName = 'Logging'
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
$Server.ConnectionContext.SqlExecutionModes = [Microsoft.SqlServer.Management.Common.SqlExecutionModes]::CaptureSql
Run Code Online (Sandbox Code Playgroud)
接下来,它创建一个将通过重命名存档的对象数组。目标表本身、所有引用表以及这些表的所有键和所有索引都将被归档:
$Database = $Server.Databases[$DatabaseName]
$Table = @($Database.Tables[$TableName, $TableSchemaName])
$ReferencingTables = $Database.Tables.ForeignKeys |
? { $_.ReferencedTable -eq $TableName -and $_.ReferencedTableSchema -eq $TableSchemaName } |
% { $_.Parent } | Sort ID | Get-Unique
$TablesToArchive = …Run Code Online (Sandbox Code Playgroud) 我正在运行,REINDEX但需要很长时间并且仍在工作。使用数据库的应用程序现在没有响应。有没有一种安全的方法可以阻止它并再次执行?PostgreSQL 版本是 8.4。
我正在尝试确定内部内存压力的原因。据我所知,Resource Monitor Ring Buffer 返回一个内部压力指标。例如,通过使用此查询,
SELECT Top (1) *
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
Run Code Online (Sandbox Code Playgroud)
XML 结果(在资源监视器标记内):
<ResourceMonitor>
<Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
<IndicatorsProcess>2</IndicatorsProcess>
<IndicatorsSystem>0</IndicatorsSystem>
<NodeId>0</NodeId>
<Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
<Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">100789</Effect>
<Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>
</ResourceMonitor>
Run Code Online (Sandbox Code Playgroud)
在Bob Dorr 的这篇文章中,来自 Memory Broker 的收缩信号可能会造成内部内存压力并反映在资源监视器通知中,IndicatorsProcess = 2 (IDX_MEMPHYSICAL_LOW)如上所示。
Slava Oks 的这篇文章展示了另一种使用RING_BUFFER_SINGLE_PAGE_ALLOCATOR. 我对这个特定的环形缓冲区了解不多,因为我从未在我的环境中见过它。
SELECT Top (1) *
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_SINGLE_PAGE_ALLOCATOR'
Run Code Online (Sandbox Code Playgroud)
这次的 XML 结果:
<Pressure status="0"><AllocatedPages>477</AllocatedPages>
<AllAllocatedPages>477</AllAllocatedPages>
<TargetPages>31553</TargetPages>
<AjustedTargetPages>31553</AjustedTargetPages>
...
</Pressure>
Run Code Online (Sandbox Code Playgroud)
我的问题是,哪些内部进程可能会导致内部物理内存压力,从而导致此问题indicator = 2 …
在 SQL Server 2012 中,索引重建作业需要很长时间(最多 8 小时)。然而,甚至没有完成一次索引重建,所以我停止了索引作业。
在监控 SQL 任务中:
state = SUSPENDED
, comment = ALTER INDEX
, APPLICATION name = Microsoft SQL server Management Studio
, Query Wait = LCK_M_SCH_M
, Head Blocker = object lock
lock Partition = 15
objid=585105175
subresource=FULL
dbid=5
id=lockaa7aae200
mode=Sch-S
associatedObjectId=585105175 1386
Run Code Online (Sandbox Code Playgroud)
提前感谢您提供任何有用的信息。
我在 MySQL 中的 UNION 查询有问题。我们的网站上有 1000 万玩家,我们希望选择具有多标准系统的玩家。例如,选择美国人,男性,年龄超过 35 岁。
我们正在使用“垂直分区”:每个标准 1 个表。例如:
* user_country
- id_user
- id_country
Run Code Online (Sandbox Code Playgroud)
我们想做这样的查询:
SELECT id_inscri FROM userdata_langue
WHERE id_langue='43'
UNION
SELECT id_inscri FROM userdata_sexe
WHERE sexe='2'
UNION
SELECT id_inscri FROM userdata_nb_jour
WHERE nb_jour>='31'
UNION
SELECT id_inscri FROM userdata_last
WHERE last<='2013-04-07'
AND last>='2013-04-03' ;
Run Code Online (Sandbox Code Playgroud)
我该如何优化?
- - - 更多细节
解释查询的输出:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY userdata_langue ref id_langue id_langue 1 const 398846 Using index
2 UNION userdata_sexe ref …Run Code Online (Sandbox Code Playgroud) 有时我想扩展现有的搜索路径,而不是替换它,比如:
首先说它已经设置如下:
SET search_path TO schema_b, schema_c, public;
Run Code Online (Sandbox Code Playgroud)
我想将我的架构添加到行的前面:
SET search_path TO schema_a + search_path; --doesn't work
Run Code Online (Sandbox Code Playgroud)
我的想法类似于我在 BASH 中所做的:
PATH=path_a:$PATH
Run Code Online (Sandbox Code Playgroud)
额外的问题,可能是相关的:有没有办法可以暂时存储当前路径,以便我可以将其更改为完全不同的内容,然后无需知道它是什么就可以恢复它?
我有一个表继承设置,可以像这样简化:
CREATE TABLE p (
id BIGSERIAL PRIMARY KEY,
type_id BIGINT,
approved BOOLEAN
);
CREATE INDEX ON p(approved);
CREATE TABLE a (
a_field VARCHAR,
PRIMARY KEY (id),
CHECK(type_id = 1::BIGINT)
) INHERITS (p);
CREATE TABLE b (
b_field INT,
PRIMARY KEY (id),
CHECK(type_id = 2::BIGINT)
) INHERITS (p);
CREATE INDEX ON b(approved);
CREATE TABLE c (
c_field NUMERIC,
PRIMARY KEY (id)
-- this table is missing the check constraint (for no good reason)
) INHERITS (p);
Run Code Online (Sandbox Code Playgroud)
我现在有一个锁定 table 的长期运行事务a …
如果我明确要求,该语句为什么不复制约束?
CREATE TABLE backup_schema.permissions (LIKE public.permissions INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS);
INSERT INTO backup_schema.permissions
SELECT *
FROM public.permissions
WHERE community_id=123;
Run Code Online (Sandbox Code Playgroud)
使用 pgadmin3 验证我发现新表(例如:backup_schema)的约束是:

但在公共模式的原始表中是这样的:

我在 Debian Linux 上使用 Postgres 9.4。我用一个用户创建了一个数据库,cindex可以访问该数据库。然而,当我尝试在命令行登录时,我什至没有提示输入密码:
myuser@myuserserver:~ $ psql -Ucindex cindex
psql: FATAL: Peer authentication failed for user "cindex"
Run Code Online (Sandbox Code Playgroud)
我还需要做什么来启用用户?下面你可以看到我已经设置的权限:
postgres@myuserserver:~$ psql
psql (9.4.13)
Type "help" for help.
postgres=# GRANT SELECT ON ALL TABLES IN SCHEMA cindex TO cindex;
GRANT
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
cindex | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | =T/postgres +
| | | | | postgres=CTc/postgres+
| | …Run Code Online (Sandbox Code Playgroud) PostgreSQL 10 在 Ubuntu 17.10 上可用吗?
我检查了 APT 上的文件夹是否确实存在:http : //apt.postgresql.org/pub/repos/apt/dists/artful-pgdg/10/
但是在我这样做之后:
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ artful-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-10
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package postgresql-10
Run Code Online (Sandbox Code Playgroud)
上述步骤适用于 Ubuntu 16.04(带有xenial-pgdg),但不适用于 17.10。
任何指针?
postgresql ×6
sql-server ×3
constraint ×1
index ×1
locking ×1
memory ×1
mysql ×1
optimization ×1
partitioning ×1
password ×1
permissions ×1
powershell ×1
psql ×1
schema ×1
smo ×1
table ×1
ubuntu ×1
union ×1