AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
主页 / dba / 问题

全部问题(dba)

Martin Hope
Moduspwnens
Asked: 2023-03-29 02:33:23 +0800 CST

MariaDB 升级需要重建表。重建花费的时间太长。选项?

  • 7

我有一个10.6.8托管在 Amazon RDS ( db.m6g.4xlarge) 上的 MariaDB 实例 ( )。它启用了自动次要升级,不幸的是,它在上次触发时导致了数小时的停机时间。

在查看日志时,问题似乎是我们的一些最大的表需要在升级完成之前重建。

error : Table rebuild required. Please do "ALTER TABLE 'my_table' FORCE" or dump/reload to fix it!

每个都需要几个小时。最大的有大约 1.7 亿行和 20 列。

我想在最坏的情况下,我们可以安排停机时间。但是,如果有某种方法可以以不同的方式做事,这样这就不会成为未来的问题,那将是更可取的。

到目前为止,我调查过:

  • 添加修剪以避免在其中一些表中保留不需要的旧数据。这使得它们足够小,重建不会导致数小时的停机
  • 将来,做并安排我自己的小升级,mysqlcheck提前运行,至少事先知道哪些表可能需要重建。这仍然不理想,因为该ALTER TABLE 'my_table' FORCE命令锁定了表,这当然也会导致我们的应用程序停机
  • 假定所需的表重建不太可能再次发生。实施自动重建,选择旧表的块并将它们插入新表,直到它们的内容匹配。然后删除旧表并将新表重命名为旧表的名称。这可行——但需要时间,并且每次需要重建表时都需要完成
  • 将大表在逻辑上拆分为具有相同架构的不同表。如果数据访问模式不经常需要一次查询多个表,那么我可以将一次为重建完成的锁定限制为一个(较小的)表,而不是一次锁定重建大表

理想情况下,我希望能够再次打开自动次要版本升级,并且它在预先选择的窗口中以最短的停机时间“正常工作”。

mysql
  • 1 个回答
  • 21 Views
Martin Hope
Eric Liprandi
Asked: 2023-03-29 00:47:26 +0800 CST

如何在 macOS 上的 mysql 客户端中搜索历史记录?

  • 6

我知道在 5.x 系列的某个时刻,MySQL的 shell从 切换readline到。editline我似乎找不到任何关于如何在我的设置中进行历史搜索的参考资料。

macos: Ventura 13.2.1
shell: zsh
mysql: 8.0.32
iTerm2: 3.4.19

我尝试~/.editrc按如下方式配置我的:

bind "^c" ed-search-prev-history 

但是Ctrl+r在 shell 中不做任何事情mysql。

我错过了什么?

mysql
  • 1 个回答
  • 11 Views
Martin Hope
Chris Cox
Asked: 2023-03-27 23:40:56 +0800 CST

MariaDB:大型 INSERT SELECT 查询失败但未生成错误

  • 6

我有一个大型复杂的神经科学数据集,我正试图将其组织到一个数据库中,以便与我的实验室进行并发和一致的访问。这是我第一次尝试使用 SQLite 进行小得多的实验,而且我已经咬得太多了。

包含神经记录的主表有大约 100 亿行。在用数据填充此表之前,我建立了一个复合主键(id, experiment_id),其中id每一行都是唯一的。我这样做是为了可以按experiment_id. 这在当时看来是个好主意。然而,一旦表被填充,在 phpMyAdmin 中添加额外的索引失败(错误弹出窗口指示新密钥已损坏)。

面对这个障碍,我找到了https://mariadb.com/kb/en/partition-maintenance/,它的第一个要点是“#1:在你知道它如何以及为什么会有帮助之前不要使用分区。 ”,然后是“表大小很少是性能问题”。因此,希望“重做”,我创建了一个具有相同列(减去该id列)但没有分区方案和索引的新表并执行了:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
START TRANSACTION;
INSERT INTO tfconv_2 (experiment_id, electrode_id, trial_id, frequency_id, time_id, value_real, value_imag)
SELECT experiment_id, electrode_id, trial_id, frequency_id, time_id, value_real, value_imag
FROM tfconv;
COMMIT;

这运行了好几天(这并不奇怪,因为首先需要好几天才能将数据放入原始表中)。在 MariaDB 努力工作的同时,我可以在 phpMyAdmin 摘要页面中看到新表的行数在上升。监视我服务器上的资源,该进程似乎正在以一种常规的、系统的方式将数据复制到新表中。

然后,有一次我去检查它时,新表上的行数减少了。SHOW PROCESSLIST透露:

   Id   User         Host           db Command    Time                   State
10237   root    localhost   singlecell  Killed  217191  Reset for next command

有了这个背景,我有三个问题:

  1. 为什么这个查询会失败?(错误日志文件在相关时间窗口内保持沉默。)
  2. 如果我再次尝试构建无分区表,您是否建议我做一些不同的事情?
  3. 有没有办法在原始分区表上设置索引,从而避免损坏?
mariadb
  • 1 个回答
  • 40 Views
Martin Hope
papshmeare
Asked: 2023-03-27 18:18:11 +0800 CST

具有 NOT NULL 外键的规范化表的正确实体关系图表示

  • 5

介绍

大家好,这主要是关于数据库设计中的继承和规范化技术及其在实体关系图中的适当表示的分类/理论问题。在实际实现中,它不会带来挑战,因为您只需将有问题的属性设置为IS NOT NULL即可。然而,对于图形表示,我对如何正确地做它有点困惑。这是一个 github gist 链接,其中包含一个交互式美人鱼图,表示特定示例的假设场景:gist

问题

重要部分在本节中: 假设我们有一个名为 PRODUCT 的实体,它可能具有不同类型的属性,具体取决于所讨论的产品(例如物理产品/数字产品)。出于这个原因,我们引入了两个“子表”,其 PK 引用 PRODUCT 的 FK 属性product_type_id。很明显,一个 PRODUCT 只能有一个单一的 product_type_id,但是因为它可以是PhysicalProduct或DigitalProduct,这两个“子表”与 PRODUCT 有什么样的关系?到目前为止,我推断它必须是图中所示的一对(零或一) 。这就是问题所在(也许不存在)。如果我们有两个一到(零或一)与强制性IS NOT NULL属性的关系是否在视觉上推断出两个一对零关系的可能性,或者它是否没有在我的脑海中点击,这就是在这种情况下应该如何?

database-design
  • 1 个回答
  • 21 Views
Martin Hope
Deekor
Asked: 2023-03-27 03:50:59 +0800 CST

查询较小的子集以扫描时间呈指数增长?

  • 6

我有一个大表,extrinsics大小将近 90GB,包含来自多个区块链的数据。

我有一个需要将近 17 分钟才能运行的查询:

select * from public.extrinsics
where chain_id = 1
ORDER BY "extrinsics"."block_number" DESC
limit 10;

我可以翻转chain_id并2运行查询,运行时间不到一秒钟。

select count(*) from "extrinsics" where chain_id = 1= ~ 38M 行
select count(*) from "extrinsics" where chain_id = 2= ~ 58M 行

我试过(没有运气):

  • 在 chain_id 和 block_number 上创建多列索引。
  • 在 chain_id 和 block_number order DESC 上创建多列索引。
  • 将 block_number 的统计数据增加到 10,000 并运行 ANALYZE
  • 将 chain_id 的统计数据增加到 10,000 并运行 ANALYZE

起初我以为是查询计划,即使我有上面提到的其他索引,它总是求助于向后扫描我的索引,但如果2 仍然很快,block_number查询计划错误似乎不是问题。chain_id

要求解释:

链 2(快速):

"Limit  (cost=0.57..7.76 rows=10 width=829) (actual time=1.563..2.379 rows=10 loops=1)"
"  Buffers: shared read=9"
"  I/O Timings: read=2.310"
"  ->  Index Scan Backward using index_extrinsics_on_block_number on extrinsics  (cost=0.57..41768857.19 rows=58091433 width=829) (actual time=1.561..2.375 rows=10 loops=1)"
"        Filter: (chain_id = 2)"
"        Buffers: shared read=9"
"        I/O Timings: read=2.310"
"Planning Time: 0.636 ms"
"Execution Time: 2.417 ms"

链 1(慢):

"Limit  (cost=0.57..11.60 rows=10 width=829) (actual time=912353.888..912356.009 rows=10 loops=1)"
"  Buffers: shared hit=1872576 read=2079934"
"  I/O Timings: read=890705.882"
"  ->  Index Scan Backward using index_extrinsics_on_block_number on extrinsics  (cost=0.57..41768857.19 rows=37874906 width=829) (actual time=912353.886..912356.003 rows=10 loops=1)"
"        Filter: (chain_id = 1)"
"        Rows Removed by Filter: 10936113"
"        Buffers: shared hit=1872576 read=2079934"
"        I/O Timings: read=890705.882"
"Planning Time: 0.207 ms"
"Execution Time: 912356.134 ms"
-- Table Definition ----------------------------------------------

CREATE TABLE extrinsics (
    id BIGSERIAL PRIMARY KEY,
    block_number bigint NOT NULL,
    extrinsic_index integer,
    timestamp bigint,
    is_signed boolean DEFAULT false,
    signer character varying,
    method character varying,
    section character varying,
    args jsonb,
    extrinsic_hash character varying,
    doc character varying[],
    success boolean DEFAULT false,
    created_at timestamp(6) without time zone NOT NULL,
    updated_at timestamp(6) without time zone NOT NULL,
    chain_id integer NOT NULL DEFAULT 1
);

-- Indices -------------------------------------------------------

CREATE UNIQUE INDEX extrinsics_pkey ON extrinsics(id int8_ops);
CREATE INDEX index_extrinsics_on_block_number ON extrinsics(block_number int8_ops);
CREATE INDEX index_extrinsics_on_chain_id ON extrinsics(chain_id int4_ops);
CREATE INDEX index_extrinsics_on_signer ON extrinsics(signer text_ops);
CREATE INDEX index_extrinsics_on_signer_and_chain_id ON extrinsics(signer text_ops,chain_id int4_ops);
CREATE UNIQUE INDEX uniq_extrinsics ON extrinsics(block_number int8_ops,extrinsic_index int4_ops,chain_id int4_ops);
CREATE INDEX index_extrinsics_on_chain_id_and_block_number ON extrinsics(chain_id int4_ops,block_number int8_ops);
CREATE INDEX blocks_front_page_index ON extrinsics(chain_id int4_ops,block_number int8_ops DESC);
CREATE INDEX dee_test ON extrinsics(block_number int8_ops DESC NULLS LAST);
postgresql
  • 1 个回答
  • 48 Views
Martin Hope
Babszem
Asked: 2023-03-27 01:23:16 +0800 CST

高度互连实体的最佳数据库解决方案?

  • 5

我正在构建一个服务(或者更确切地说是一组微服务)来充当类似社交网络的网站的后端。简而言之,这意味着我的数据如下:

  • 数百万个实体
  • 具有数十种属性
  • 随着时间的推移,实体之间可能存在数千个连接(例如在 Facebook 上,某人可能有数千个“朋友”)。
    • (有不止一种类型的连接,每一种都可能有数千个)
    • 连接示例:
      • 实体 A 认识实体 B
      • 实体 A 已阻止实体 B
      • ETC。
      • 从概念上讲,每个实体都维护着其他实体的一长串标识符
  • 我需要能够在哪里进行搜索
    • 我可以根据要匹配的一组属性搜索所有实体
    • 同时过滤掉发起实体已经存在的连接

我试图弄清楚什么是存储这些数据的最佳数据库解决方案。我不精通数据库技术,所以我需要一些建议来考虑。

我知道 SQL / 关系数据库可以轻松地针对前 2 个标准(实体数量和属性数量)进行扩展,但我不确定它们是否适合管理连接。

我需要一种合适的数据库技术,它也可以以分布式方式设置——并且最好在云环境中可用。如果那是 SQL 数据库,我将如何存储和管理连接?

database-recommendation
  • 1 个回答
  • 51 Views
Martin Hope
PS_22
Asked: 2023-03-26 19:10:33 +0800 CST

找出学生未连续注册某一科目的最大次数

  • 7

在此处输入图像描述

这是我的示例数据集。在 MySQL 中寻找代码

期望的输出

学生 次
美国广播公司 3 (学生abc没有连续报考2021年T3、T4和2022年T1的任何科目)
xyz 4 (学生xyz未连续报读2021年T3、T4、2022年T1、T2任何科目)

代码:

create  table test_student (student varchar(25), Term char (2),
year int, Subject varchar(20));

insert into test_student
values ("abc","t1","2021","sub1"),
("abc","t2","2021","sub2"),
("abc","t3","2021",""),
("abc","t4","2021",""),
("abc","t1","2022",""),
("abc","t2","2022","sub3"),
("abc","t3","2022",""),
("abc","t4","2022",""),
("abc","t1","2023","sub4"),
("abc","t2","2023",""),
("abc","t3","2023","sub5"),
("XYZ","t1","2021","sub1"),
("XYZ","t2","2021","sub2"),
("XYZ","t3","2021",""),
("XYZ","t4","2021",""),
("XYZ","t1","2022",""),
("XYZ","t2","2022",""),
("XYZ","t3","2022","sub3"),
("XYZ","t4","2022",""),
("XYZ","T1","2023",""),
("XYZ","t2","2023","sub4"),
("XYZ","t3","2023","sub5");

下面的代码给我输出 abc: 3 xyz: 3

WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY student, subject ORDER BY term) AS term_num
    FROM test_student
)
SELECT student,  MAX(gap_length) AS max_gap
FROM (
    SELECT student, 
        term_num - ROW_NUMBER() OVER (PARTITION BY student, year ORDER BY term) AS gap_length
    FROM cte
    WHERE subject = ''
) AS gaps
GROUP BY student;
mysql
  • 3 个回答
  • 362 Views
Martin Hope
SeanGaff
Asked: 2023-03-24 19:54:54 +0800 CST

如果不在 TNS 中,如何检索 Oracle 数据库链接的连接字符串

  • 5
这个问题是从 Stack Overflow迁移过来的,因为它可以在 Database Administrators Stack Exchange 上回答。4 天前迁移 。

我是 Oracle 19C 数据库的 DBA,其中有许多数据库链接。其中一些链接是本地的,链接到我们防火墙内的其他实例,而其他链接是远程的,链接到第三方管理的数据库。我接任该职位时继承了这些链接,因此对它们的了解有限。

我有一个问题,对于其中一个第三方链接,我收到报告称通过链接向第三方传输数据的预定作业未传送内容,网络流量为零。但是,作业没有生成任何错误,我可以手动查询远程数据库表。我需要连接方法来向我的 IT 同事确认/拒绝他们监控的网络流量路由是否正确。

我已经确定了我的哪些数据库链接是为这次数据传输设置的,我在 DBA_DB_LINKS 中搜索过:

当我执行

select * from dba_db_links;

对于我感兴趣的数据库链接,我得到以下条目。

BODCDB BSA 海洋 BSA 29/05/2014 11:38:45 否 否 是 否

这没有提供 BSA 链接使用的连接字符串的任何详细信息,而这是我需要的关键信息。它不在 TNSNAMES.ORA 中,所以数据库中是否有其他地方保存它?

非常感谢

肖恩

oracle
  • 3 个回答
  • 11 Views
Martin Hope
Nir
Asked: 2023-03-25 17:16:57 +0800 CST

如何使 login.sql 输出静音

  • 5
[[email protected] etl]$ cat login.sql
col TAB# new_value TAB NOPRINT
select chr(9) TAB# from dual;
set markup csv on delimiter "&TAB" quote off
set heading off termout off echo off feedback off verify off numformat 99999999999.9999999999999 null '\N'
[[email protected] etl]$ cat a.sh
#!/bin/bash

export ORACLE_PATH="/home/nir/etl"

echo "select * from dms_u.test_etl_source;" | sqlplus -s ${USER}/${PASS}@${TNS}

[[email protected] etl]$ ./a.sh




aa  \N  aa
\N  aa  aa
aa  aa  \N
\N  \N  aa
\N  aa  \N
aa  \N  \N
\N  \N  \N
aa  aa  aa

我正在使用 将输出login.sql设为sqlplustsv。我想要的是在没有任何输出的情况下运行login.sql。如果我将其放入glogin.sql会-s起作用。但我需要 tsv 登录仅在特定情况下发生(因此ORACLE_PATH)。

所以我想a.sh返回:

[[email protected] etl]$ ./a.sh
aa  \N  aa
\N  aa  aa
aa  aa  \N
\N  \N  aa
\N  aa  \N
aa  \N  \N
\N  \N  \N
aa  aa  aa
oracle
  • 1 个回答
  • 13 Views
Martin Hope
TTT
Asked: 2023-03-25 04:32:36 +0800 CST

后悔一个身份:有没有办法强制插入指定身份列?

  • 10

为了防止XY 问题,这是我们试图解决的实际问题:

问题:

不幸的是,我们有一堆查找表是在主键上使用标识列创建的,它是一个int. 我们希望我们可以简单地删除标识,但是,我们有一些带有指向标识列的外键的大表,我的理解是在这种情况下删除标识很困难。我们后悔身份的原因是因为这些表需要跨多个环境同步,开发人员通过编写脚本向这些表中插入数据,而我们在多个环境中运行这些脚本但不一定总是以相同的顺序,所以我们问开发人员始终:

  1. 启用标识插入
  2. 插入具有硬编码整数 ID 的行
  3. 禁用标识插入

如果每个人都这样做,数据要么保持同步,要么脚本失败,我们可以立即采取纠正措施来解决冲突。但是当然,有时开发者会忘记遵守规则,只是不加标识地插入,不同环境下不同顺序运行的不同脚本的自增导致它们不同步,然后问题就出现了。

一个想法:

我们可以强制开发人员始终指定标识列吗?我不认为有一种方法可以简单地禁用这些表上的标识。如果我们将身份重新播种到一个小数字怎么办?当种子值已经存在时,任何未指定所有列的插入都将失败,并继续失败,直到插入尝试的次数超过现有(连续)行数。但是在一次正确的插入之后,重新为表播种,下一次不正确的插入将再次使用自动增量。所以这个想法的外推是在每次插入后将表重新播种到一个较低的现有数字(可能使用触发器,这感觉很奇怪,但可能有效?),或者按计划,或者每次我们运行开发人员的脚本时.

这是一个合理的想法,和/或是否有更好的解决方案?

旁注:我们确实有一些其他的想法,我认为这些想法超出了这个问题的范围,例如:

  1. 一个门控签入,它会解析脚本以插入某些表而不指定标识列,如果我们检测到这一点就会失败。
  2. 将所有这些数据存储在源中,并在部署时更新整个表。(而不是使用运行一次的插入脚本。)
  3. 不要在所有环境中运行更改这些表的数据脚本,而是使用复制或其他同步机制。

尽管从长远来看,这些其他想法可能会更好,但似乎最容易实现的目标只是重新播种这些表,因此不正确的插入将失败。

sql-server
  • 3 个回答
  • 552 Views
下一页

Sidebar

Stats

  • 问题 199037
  • 回答 263511
  • 最佳答案 131755
  • 用户 66345
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve