inserted_at
我的 postgres(v15.3) db 中有一个名为TIMESTAMPTZ
. 插入时该值将始终以 UTC 形式传递
我想检索这些记录的所有记录,自上次记录以来已经过去了 30 天inserted_at
。我可以将当前日期和时间(以 UTC 为单位)与inserted_at
值进行比较。
我怎样才能做到这一点?
inserted_at
我的 postgres(v15.3) db 中有一个名为TIMESTAMPTZ
. 插入时该值将始终以 UTC 形式传递
我想检索这些记录的所有记录,自上次记录以来已经过去了 30 天inserted_at
。我可以将当前日期和时间(以 UTC 为单位)与inserted_at
值进行比较。
我怎样才能做到这一点?
我正在学习 WAL 在 postgresql 中是如何工作的,但我不太明白 len(record) 值是如何获得的,以及在哪里可以找到记录。
对于测试,我做了这样的插入:
INSERT INTO int_table (field1, field2, field3, field4, field5) VALUES (1, 1, 1, 1, 1);
INSERT INTO int_table (field1, field2, field3, field4) VALUES (1, 1, 1, 1);
INSERT INTO int_table (field1, field2, field3) VALUES (1, 1, 1);
在 pg_waldump.exe 的帮助下,我得到了 wal 转储:
rmgr: Heap len (rec/tot): 79/ 79, ...
rmgr: Heap len (rec/tot): 75/ 75, ...
rmgr: Heap len (rec/tot): 71/ 71, ...
所以,我可以看到记录之间的差异是 4 个字节(一个 int 值)。但是,我对其他字节中包含的信息感到好奇。例如,最后一条记录有 59 字节的附加信息,以及三个值 (1, 1, 1) 的 4 + 4 + 4 字节。
所以,我的问题是这 59 个字节被写入何处以及为何写入。
我已经在同一实例上的 2 个不同数据库上恢复了 2 个数据库,调用它geo
并且restore1
架构是相同的,唯一的区别是geo
数据库仅包含 <= 之前2023-11-23
和 >= 之后的记录2023-12-01
,而restore1
包含 <= 2023-11-30
,我如何复制这些每个表容易缺失值(2023-11-23
直到数据库) 2023-11-30
?restore1
geo
我能想到的一种方法是,为每个表创建一个程序,从之前选择最新的 id 2023-11-24
(geo
称为X
),然后选择 id 大于的所有记录X
,然后手动将其插入geo
数据库。
有没有更简单的方法?
有数百张表,但大多数都是这样的:
restore1=# \d station_logs_599
Table "public.station_logs_599"
Column | Type | Collation | Nullable | Default
------------------------+--------------------------------+-----------+----------+------------------------------------------
id | integer | | not null | nextval('station_logs_id_seq'::regclass)
created_at | timestamp(6) without time zone | | |
updated_at | timestamp(6) without time zone | | |
deleted_at | timestamp(6) without time zone | | |
submitted_at | timestamp(6) without time zone | | not null |
sequence | integer | | |
level_sensor | double precision | | |
accel_x | double precision | | |
accel_y | double precision | | |
accel_z | double precision | | |
power_current | double precision | | |
ip_address | character varying(50) | | |
log_type | integer | | |
station_id | integer | | not null |
power_voltage | double precision | | |
data | jsonb | | |
is_deleted | boolean | | not null | false
temperature | double precision | | |
wind_speed | double precision | | |
soil_moisture | double precision | | |
wind_direction | double precision | | |
raindrop | double precision | | |
humidity | integer | | |
barometric_pressure | double precision | | |
wind_speed_average | double precision | | |
wind_gust | double precision | | |
wind_direction_average | double precision | | |
rain_rate | double precision | | |
Indexes:
"station_logs_599_epoch" btree (date_part('epoch'::text, submitted_at))
"station_logs_599_submitted_at" btree (submitted_at)
"uniq_sid_sat_599" UNIQUE CONSTRAINT, btree (submitted_at)
Foreign-key constraints:
"station_logs_599_station_fk" FOREIGN KEY (station_id) REFERENCES stations(id)
我有一个包含超过 18 亿行的 Oracle 表,我需要删除最多 2.6 亿行。
我是一名 Microsoft SQL DBA,因此不太熟悉 Oracle 语法和此类过程的最佳实践。
任何建议和意见将不胜感激。
让我在这篇文章的序言中说,我在跟踪中遗漏了一些事件,但我已经添加了它们,以便下次发生这种情况时添加它们。
最近,我们在我们的环境中看到了 HADR_SYNC_COMMIT 等待类型的奇怪激增(~40k tran/s)。今天的“事件”发生在凌晨4点58分:
在继续之前,我必须补充一点,我们正在对一个大型审计表进行在线索引维护(从 OLTP 表触发器大量记录到此审计表的意义上进行审计),并且索引重建本身被阻止约 22 秒。显然,这在这个特定实例中发挥了作用,但我不太确定它与 HADR_SYNC_COMMIT 有何关系。此外,我们在白天不进行索引维护时也看到过这种情况发生。
2023 年 12 月 1 日凌晨 4:11 左右再次发生了类似的问题,我相信我明白发生了什么。不幸的是,我没有针对这种情况的扩展事件,但我确实有一些日志记录可以描绘出更清晰的画面。从 2023-12-01 04:10:18.5430090 开始,Ola 的索引维护记录了相关数据库上索引的开始时间。Ola 报告的完成时间为 2023-12-01 04:11:13.9431563,但我相信实际 REBUILD WITH ONLINE = ON 完成的时间要早得多。
在查看 DPA 时,我注意到 pagelatch_sh 和 pagelatch_ex 等待时间在凌晨 4:11:03-4:11:04 出现峰值:
紧接着这些等待,同一个查询开始看到 HADR_SYNC_COMMIT,并且这些相同的等待在凌晨 4:11:13-4:11:14 完全消失,这正是 Ola 报告索引完成的时间。我的假设是索引 REBUILD 是在凌晨 4:11:03 提交的(大约需要 45 秒的工作),这导致同一数据库中的不相关 INSERT 查询只是等待所有这些日志块在辅助数据库上硬化。一旦索引完成,剩余的日志块就会立即硬化,因为它们只是微小的插入。
我的 MySQL 服务器已正确配置以下参数
mysql> show global variables like '%have_ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show global variables like 'ssl_ca';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| ssl_ca | ca.pem |
+---------------+--------+
1 row in set (0.00 sec)
mysql> show global variables like 'ssl_cert';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| ssl_cert | server-cert.pem |
+---------------+-----------------+
1 row in set (0.00 sec)
mysql> show global variables like 'ssl_key';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| ssl_key | server-key.pem |
+---------------+----------------+
1 row in set (0.00 sec)
mysql> show global variables like 'datadir';
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| datadir | /dados/ |
+---------------+---------+
1 row in set (0.00 sec)
这些文件存在于datadir
[root@mysqlen1 dados]# ls -l ca.pem server-cert.pem server-key.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 3 10:28 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Nov 3 10:28 server-cert.pem
-rw------- 1 mysql mysql 1680 Nov 3 10:28 server-key.pem
然后我创建一个用户:
mysql> create user 'teste'@'%' identified by 'teste123' require ssl;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
我可以使用证书进行连接
[root@TCCPUC-ENGDADOS:~]# mysql -uteste -p'teste123' -h 192.168.0.110 --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.28 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
但也没有证书
[root@TCCPUC-ENGDADOS:~]# mysql -uteste -p'teste123' -h 192.168.0.110
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 8.0.28 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
它是否正确?我可以强制用户仅使用这些证书登录吗?
我有以下查询,我在 2 个表中搜索商品价格
select productSerial, productName
coalesce(
(select top 1 price
from productPrice pp
where pp.id = wi.id
order by pp.date),
(select top 1 price
from productPriceEast ppe
where ppe.id = wi.id
order by ppe.date)
) as baseprice
from warehouseItems wi
但现在我也想要描述,如何更改查询以获得多于 1 列?我无法将查询更改为此,因为合并会失败。我正在考虑选择合并到临时表中的这些查询,并进行某种连接而不是合并,不确定这是否是正确的方法。
select top 1 price, productDescrip
from productPriceEast
where ppe.id = wi.id
order by ppe.date
我设置了一个扩展事件会话来跟踪注意力事件,以监视超时的过程。这是创建脚本:
CREATE EVENT SESSION [ApplicationTimeout3] ON SERVER
ADD EVENT sqlserver.attention(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack,sqlserver.username)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD TARGET package0.event_file(SET filename=N'D:\ExtendedEvents\ApplicationTimeout3.xel',max_file_size=(100),max_rollover_files=(5))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
GO
问题是,在我得到的超时中,我没有得到 sql_text。(我也没有得到 tsql_frame 或 tsql_stack)。当我执行“观看实时数据”时,它不会返回。
我确实看到了超时,它们与我在查询 sys.query_store_runtime_stats 时看到的超时同时发生(execution_type_desc = 'Aborted')。但是,我返回的字段集有限,但它们不是我需要的字段。
另外顺便说一下,通过扩展事件记录的事件比我查询 sys.query_store_runtime_stats 时看到的要多。我不知道它们是什么。
关于如何实际获取正在执行的 sql 的任何线索?我可以通过查询查询存储表来获取存储过程名称。我想获得的是调用存储过程所使用的参数。
我有 2 节点 SQL Server 2019 FCI 群集,从一个节点故障转移到另一个节点最多需要 4 分钟。
该集群有 3 个用户数据库,是从较旧的 SQL Server 版本迁移而来的:
更改恢复模型和/或提高兼容性级别是否会减少集群的故障转移时间?
不幸的是,我无法访问服务器,但检查日志绝对是我请求的第一件事。另外,我知道兼容性级别可能是影响故障转移时间的最后一个因素。但我无法找到任何有关 FCI 集群的恢复模型与故障转移时间关系的数据。
我担心使用 ADR 但在 Microsoft 的某个地方读到它是在 SQL Server 2019 中引入并在 SQL Server 2022 中改进的。也许当我在几年后进行下一次环境升级时。