在从云故障中恢复时,我发现PostgreSQL数据库中的某些表行为异常。这些表使用主键编制索引,但pg_dump产生重复字段,pg_restore在备份服务器上失败。
我试图REINDEX:
REINDEX INDEX rank_details_pkey;
ERROR: could not create unique index "rank_details_pkey"
DETAIL: Table contains duplicated values.
Run Code Online (Sandbox Code Playgroud)
指数定义为:
<table info here>
Indexes:
"rank_details_pkey" PRIMARY KEY, btree (user_id)
Run Code Online (Sandbox Code Playgroud)
而且,奇怪的是,
SELECT user_id, COUNT(*) FROM <table name> GROUP BY 1 HAVING COUNT(*) > 1;
user_id | count
---------+-------
(0 rows)
Run Code Online (Sandbox Code Playgroud)
总而言之 - 我的表中有重复的值,无法找到或清除。
任何想法如何解决这一问题?这是一个生产服务器,所以所有修复都应该在不影响服务的情况下完成。
BTREE在查询速度、磁盘存储和内存使用方面,在 MySQL中使用索引的优缺点是什么?
BTREE按递增顺序提供更简单的迭代?BTREE?BTREEindex有什么缺点吗?我试图显示一个名为的存储过程的 SQL 代码add_pixel:
mysql> SHOW PROCEDURE CODE add_pixel;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Run Code Online (Sandbox Code Playgroud)
我已确保该程序存在:
mysql> CALL add_pixel();
ERROR 1318 (42000): Incorrect number of arguments for PROCEDURE pixels.add_pixel; expected 3, got 0
Run Code Online (Sandbox Code Playgroud)
和SHOW CREATE PROCEDURE作品:
mysql> SHOW CREATE PROCEDURE add_pixel;
+-----------+----------+------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure | character_set_client …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的表,带有 blob 字段,称为data. 我试图弄清楚为什么它没有被很好地缓存并且重复的SELECTs 很慢:
=> SELECT pg_size_pretty(pg_total_relation_size('data'));
157 GB
Run Code Online (Sandbox Code Playgroud)
这看起来有点大,所以我试着总结一下数据:
=> SELECT pg_size_pretty(pg_relation_size('data'));
19 GB
Run Code Online (Sandbox Code Playgroud)
随着指数:
SELECT pg_size_pretty(pg_relation_size('data_pkey'));
757 MB
SELECT pg_size_pretty(pg_relation_size('data_file_end_date_idx'));
766 MB
SELECT pg_size_pretty(pg_relation_size('data_file_end_date_idx'));
766 MB
SELECT pg_size_pretty(pg_relation_size('data_merged_idx'));
854 MB
SELECT pg_size_pretty(pg_relation_size('data_owner_idx'));
794 MB
SELECT pg_size_pretty(pg_relation_size('data_session_format_idx'));
779 MB
Run Code Online (Sandbox Code Playgroud)
数据和索引大小的总和约为 26 GB,但总关系大小接近 160 GB。该表刚刚从转储中恢复,此后没有进行任何写入。
我想知道某个 PostgreSQL 表是否是任何继承关系的一部分(即是其他表的父表还是子表)。
有查询吗?继承数据存储在哪里?
我打算在 MySQL 数据库中存储一些 Java 对象,并附上时间戳。这些对象应该以滑动窗口的方式保存(也称为循环缓冲区),这意味着N应该只保留特定类型的最后一个项目。
我的一般想法是一个INSERT触发器:
DELETE FROM pixels WHERE type="type_of_new_pixel"
AND id NOT IN
(SELECT id FROM pixels
WHERE type="type_of_new_pixel"
ORDER BY timestamp DESC LIMIT N);
Run Code Online (Sandbox Code Playgroud)
INSERTs激活一次触发器。我的清单中会有一些额外的项目,但没关系。我该如何实施?会id % 100 == 0检查吗?考虑下表:
mysql> DESCRIBE pixels;
+---------------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+-------------------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| pixel_id | varchar(32) | NO | MUL | NULL | |
| creation_time | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
| pixel | mediumblob | NO | | NULL | |
+---------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.04 sec)
Run Code Online (Sandbox Code Playgroud)
用一些数据:
mysql> SELECT * FROM pixels; …Run Code Online (Sandbox Code Playgroud) 以下 MySQL 警告的含义是什么:
Statement may not be safe to log in statement format.
Run Code Online (Sandbox Code Playgroud)
我的mysqld.err档案中每天都有数以万计的此类陈述,我不知道应该从哪里开始调查。
按照另一个答案给出的建议,我尝试digest()在 AWS RDS 上的 PostgreSQL 9.3 上使用该函数:
devdb=> SELECT digest('blah', 'sha1');
ERROR: function digest(unknown, unknown) does not exist
LINE 1: SELECT digest('blah', 'sha1');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
即使存在 pgcrypto:
devdb=> SHOW rds.extensions;
Run Code Online (Sandbox Code Playgroud)
btree_gin,btree_gist,chkpass,citext,cube,dblink,dict_int,dict_xsyn,earthdistance,fuzzystrmatch,hstore,intagg,intarray,isn,ltree,pgcrypto,pgrowlocks,pg_trgm,plperl,plpgsql,pltcl,posttiger,postggis_ tablefunc,tsearch2,unaccent,uuid-ossp
如何启用该digest()功能?
我在AWS RDS论坛上有共同提问,会发帖互相更新。
digest() 数据库上似乎不存在:
devdb=> \df digest
List of functions
Schema | Name | Result data type | Argument …Run Code Online (Sandbox Code Playgroud) 我正在调查 RDS 上 PostgreSQL 数据库的高负载。作为调查的一部分,我正在运行以下查询:
SELECT now()-query_start, state, query FROM pg_stat_activity ORDER BY 1 DESC;
Run Code Online (Sandbox Code Playgroud)
此查询返回数据库上运行时间最长的查询。然后,我手动将查询文本复制到另一个窗口,并运行EXPLAIN每个查询以识别需要索引的较长查询。
有没有办法自动运行EXPLAIN每个查询pg_stat_activity?
mysql ×5
postgresql ×4
amazon-rds ×1
btree ×1
delete ×1
hashing ×1
index ×1
log ×1
primary-key ×1
replication ×1
size ×1
source-code ×1
subquery ×1
trigger ×1
warning ×1