AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / 问题

All perguntas(dba)

Martin Hope
Jice
Asked: 2023-12-17 19:10:20 +0800 CST

Encadeie 2 consultas com \gexec no psql

  • 7

Gostaria de produzir um dicionário de dados a partir das tabelas de catálogo de um banco de dados Postgres. Eu queria ter o nome da tabela em uma linha e depois a lista de colunas.
Eu tentei fazer isso com \gexec:

\set schema '''my_schema'''
\set fname 'out_file.txt'
\o :fname
SELECT format('
select ''>>> %I'';
select column_name, data_type, coalesce(character_maximum_length, numeric_precision), description
  from information_schema.columns
       left join pg_catalog.pg_description on objoid = ''%I.%I''::regclass and objsubid = ordinal_position
 where table_name = ''%I''', table_name, table_schema, table_name, table_name)
FROM 
   information_schema.tables
where table_schema = :schema
order by table_name
\gexec
\o

Mas a primeira afirmação parece ter sido omitida e o nome da tabela não aparece no resultado.
Claro, eu poderia simplesmente adicionar o nome da tabela em cada linha, mas para o meu propósito, isso significa um processo extra depois de colocar tudo isso em uma documentação adequada.

Existe uma maneira de ter o resultado das 2 consultas no arquivo de resultados?

postgresql
  • 1 respostas
  • 35 Views
Martin Hope
Kevin Meredith
Asked: 2023-12-16 22:19:51 +0800 CST

Entenda a replicação de sincronização Multi-AZ do AWS RDS

  • 6

Os documentos Multi-AZ AWS RDS declaram:

insira a descrição da imagem aqui

  1. O que é “replicação síncrona em nível de bloco?”
  2. Dado que essa replicação está no nível do disco, e não no nível do banco de dados, esse formato é tão confiável quanto a replicação do banco de dados?
replication
  • 1 respostas
  • 21 Views
Martin Hope
Nikita Glukhov
Asked: 2023-12-16 09:19:23 +0800 CST

Por que a verificação do índice pode ser lenta no Postgres?

  • 6

Eu tenho uma consulta:

WITH route_ids_filtered_by_shipments AS (
    SELECT DISTINCT
        rts.route_id
    FROM
        route_to_shipment rts
    JOIN
        shipment s
            ON rts.shipment_id = s.shipment_id
    WHERE
        s.store_sender_id = ANY('{"a2342659-5f2f-11eb-85a3-1c34dae33151","7955ab25-0511-11ee-885e-08c0eb32014b","319ce173-2614-11ee-b10a-08c0eb31fffb","4bdddeb3-5ec9-11ee-b10a-08c0eb31fffb","8e6054c5-6db3-11ea-9786-0050560307be","485dc39c-debc-11ed-885e-08c0eb32014b","217d0f7b-78de-11ea-a214-0050560307be","a5a8a21a-9b9a-11ec-b0fc-08c0eb31fffb","79e7d5be-ef8b-11eb-a0ee-ec0d9a21b021","3f35d68a-1212-11ec-85ad-1c34dae33151","087bcf22-5f30-11eb-85a3-1c34dae33151","c065e1c8-a679-11eb-85a9-1c34dae33151"}'::uuid[])
)
SELECT
    r.acceptance_status
,   count(*) count
FROM
    route r
JOIN
    route_ids_filtered_by_shipments rifs
        ON r.route_id = rifs.route_id
WHERE
    r.acceptance_status <> 'ERRORED'::route_acceptance_status
GROUP BY
    r.acceptance_status;

Seu plano de execução (obtido via EXPLAIN (ANALYZE, BUFFERS, SETTINGS):

HashAggregate  (cost=579359.05..579359.09 rows=4 width=12) (actual time=6233.281..6669.596 rows=3 loops=1)
  Group Key: r.acceptance_status
  Batches: 1  Memory Usage: 24kB
  Buffers: shared hit=14075979 read=573570
  I/O Timings: shared/local read=19689.039
  ->  Hash Join  (cost=564249.11..578426.89 rows=186432 width=4) (actual time=6064.176..6658.862 rows=69460 loops=1)
        Hash Cond: (r.route_id = rts.route_id)
        Buffers: shared hit=14075979 read=573570
        I/O Timings: shared/local read=19689.039
        ->  Seq Scan on route r  (cost=0.00..13526.16 rows=248230 width=20) (actual time=0.015..112.580 rows=248244 loops=1)
              Filter: (acceptance_status <> 'ERRORED'::route_acceptance_status)
              Rows Removed by Filter: 7879
              Buffers: shared hit=5112 read=3492
              I/O Timings: shared/local read=35.687
        ->  Hash  (cost=561844.75..561844.75 rows=192349 width=16) (actual time=6063.413..6499.725 rows=69460 loops=1)
              Buckets: 262144  Batches: 1  Memory Usage: 5304kB
              Buffers: shared hit=14070867 read=570078
              I/O Timings: shared/local read=19653.352
              ->  HashAggregate  (cost=557997.77..559921.26 rows=192349 width=16) (actual time=6038.518..6487.332 rows=69460 loops=1)
                    Group Key: rts.route_id
                    Batches: 1  Memory Usage: 10257kB
                    Buffers: shared hit=14070867 read=570078
                    I/O Timings: shared/local read=19653.352
                    ->  Gather  (cost=1001.02..555707.18 rows=916234 width=16) (actual time=0.976..6341.587 rows=888024 loops=1)
                          Workers Planned: 7
                          Workers Launched: 7
                          Buffers: shared hit=14070867 read=570078
                          I/O Timings: shared/local read=19653.352
                          ->  Nested Loop  (cost=1.02..463083.78 rows=130891 width=16) (actual time=1.576..5990.903 rows=111003 loops=8)
                                Buffers: shared hit=14070867 read=570078
                                I/O Timings: shared/local read=19653.352
                                ->  Parallel Index Only Scan using route_to_shipment_pkey on route_to_shipment rts  (cost=0.56..78746.01 rows=517565 width=32) (actual time=0.050..733.728 rows=452894 loops=8)
                                      Heap Fetches: 401042
                                      Buffers: shared hit=94576 read=38851
                                      I/O Timings: shared/local read=2255.435
                                ->  Index Scan using shipment_pkey on shipment s  (cost=0.46..0.74 rows=1 width=16) (actual time=0.011..0.011 rows=0 loops=3623151)
                                      Index Cond: (shipment_id = rts.shipment_id)
"                                      Filter: (store_sender_id = ANY ('{a2342659-5f2f-11eb-85a3-1c34dae33151,7955ab25-0511-11ee-885e-08c0eb32014b,319ce173-2614-11ee-b10a-08c0eb31fffb,4bdddeb3-5ec9-11ee-b10a-08c0eb31fffb,8e6054c5-6db3-11ea-9786-0050560307be,485dc39c-debc-11ed-885e-08c0eb32014b,217d0f7b-78de-11ea-a214-0050560307be,a5a8a21a-9b9a-11ec-b0fc-08c0eb31fffb,79e7d5be-ef8b-11eb-a0ee-ec0d9a21b021,3f35d68a-1212-11ec-85ad-1c34dae33151,087bcf22-5f30-11eb-85a3-1c34dae33151,c065e1c8-a679-11eb-85a9-1c34dae33151}'::uuid[]))"
                                      Rows Removed by Filter: 1
                                      Buffers: shared hit=13976291 read=531227
                                      I/O Timings: shared/local read=17397.917
"Settings: effective_cache_size = '256GB', effective_io_concurrency = '250', max_parallel_workers = '24', max_parallel_workers_per_gather = '8', random_page_cost = '1', seq_page_cost = '1.2', work_mem = '128MB'"
Planning:
  Buffers: shared hit=16
Planning Time: 0.409 ms
Execution Time: 6670.976 ms

Minha tarefa é fazer com que a consulta seja executada em pelo menos 1 segundo. Posso observar no plano (com base no meu conhecimento atual sobre otimização de consultas PG) que alguns nós têm um grande número de buscas de heap e isso pode ser curado com VACCUM em uma tabela. O que estou tentando compreender:

  1. Por que o PG escolheu ONo predicado de junção rts.shipment_id = shipment_idcomo base para a construção de um conjunto de linhas e realizou a filtragem store_sender_iddesse conjunto se houver um índice separado na shipment.store_sender_idcoluna que seja altamente seletivo. No meu entendimento, encontrar um número relativamente pequeno de linhas correspondentes store_sender_ide filtrar rts.shipment_id = shipment_idseria muito mais rápido. Ou pode haver união de varreduras de índice de bitmap (via BitmapAnd).
  2. Varredura de índice usandoshipping_pkey em remessas (custo=0,46..0,74 linhas=1 largura=16) (tempo real=0,011..0.011 linhas=0 loops=3623151)

Se eu multiplicar o tempo total real pelo loopscontador para obter o tempo real, chego perto de 40 segundos, quando a consulta é concluída em 7 segundos. Como isso poderia ser???

postgresql
  • 1 respostas
  • 100 Views
Martin Hope
Rohan
Asked: 2023-12-15 20:19:47 +0800 CST

Como adicionar índice a uma tabela grande com 60 milhões de registros sem tempo de inatividade?

  • 11
A recompensa expira em 6 dias . As respostas a esta pergunta são elegíveis para uma recompensa de +150 reputação. Rohan quer recompensar uma resposta existente .

temos lutado com um problema nos últimos dias. Queremos adicionar um índice a uma tabela enorme com 60 milhões de registros. No início, tentamos adicioná-lo com a sintaxe básica do MySQL. Mas isso obstruiu nosso banco de dados de produção. Essa tabela é usada com muita frequência em consultas de produção. Então tudo sofreu.

Nosso banco de dados está hospedado no AWS RDS. É Mysql 5.7. Estamos usando Laravel como nosso framework PHP

A próxima coisa que lemos foi que podemos copiar a tabela atual para uma nova. Em seguida, adicione o índice à nova tabela. Em seguida, mude o modelo laravel para usar a nova tabela. Achamos que fazia sentido e que seria bastante fácil

Mas copiar os dados da tabela de uma tabela para a nova demorava muito tempo. Nossos cálculos mostraram que levaria dias. Tentamos usar Laravel e também comandos SQL. Mas foi muito lento de qualquer maneira.

Depois tentamos exportar os dados como CSV e importá-los, mas, novamente, muito lento. Os primeiros milhões de registros seriam inseridos rapidamente, mas a inserção da tabela se tornaria extremamente lenta.

Finalmente tentamos mysqldumpe percebemos que ele também bloqueia a nova tabela durante a inserção, talvez por isso seja rápido o suficiente. Demorou cerca de 6 horas para copiar a tabela para uma nova. MAS faltavam 2 milhões de registros neste método. Também verificamos quantos registros entraram na tabela existente durante a exportação/importação, eram apenas cerca de 100K. Portanto, faltavam 1,9 milhão de registros na exportação/importação e não conseguimos descobrir o porquê.

Depois de passar por todos esses caminhos diferentes, decidimos colocar o aplicativo em tempo de inatividade e adicionar o índice na enorme mesa

Eu queria saber se outras pessoas também enfrentam esse problema? Existe uma maneira de adicionar índices em uma tabela enorme sem causar tempo de inatividade na produção? Ou existe uma maneira mais rápida de copiar uma grande tabela MySQL sem perda de dados?

mysql
  • 1 respostas
  • 7 Views
Martin Hope
Student
Asked: 2023-12-15 01:21:17 +0800 CST

Falha na conexão de erro SSPI do PostgreSQL:: 1), falha na porta 5432: fe_sendauth: nenhuma senha fornecida

  • 5

Novo no PostgreSQL. Instalado o Postgresql 16 no servidor Windows. Em pg_ident.conf, adicionei

sspi userxyz@domínio userxyz

Em pg_hba.conf, adicionei

host   all   userxyz   0.0.0.0/0   sspi   map=sspi

No PGAdmin, adicionei o nome de usuário userxyz sem senha.

Mas estou recebendo falha na conexão:: 1), falha na porta 5432: fe_sendauth: erro sem senha fornecida.

Apenas tentando autenticar userxyz no PostgreSQL no Windows. o que estou perdendo? Obrigado

postgresql
  • 1 respostas
  • 18 Views
Martin Hope
paulH
Asked: 2023-12-14 22:45:07 +0800 CST

A tarefa Executar Pacote do SSIS demora para começar a ser executada pela primeira vez

  • 6

Estou migrando um pacote SSIS do SQL Server 2012 para um novo servidor 2022. O pacote usa a tarefa Executar Pacote dentro de um loop para executar outro pacote no projeto. Estou descobrindo que na primeira vez que a tarefa Executar Pacote é executada, parece que demora muito para iniciar e não sei por que ou onde procurar uma causa.

A parte relevante do pacote principal é esta:

insira a descrição da imagem aqui

Observando os tempos de execução, a primeira vez que o pacote Generic Parsing é chamado leva mais de 10 segundos (a coluna final em ms), mas os componentes do pacote levam apenas uma fração desse tempo. As execuções subsequentes da Análise Genérica (também mostradas nos resultados) são executadas conforme esperado, sem aquele atraso inicial.

insira a descrição da imagem aqui

performance
  • 1 respostas
  • 26 Views
Martin Hope
Andy
Asked: 2023-12-14 21:25:47 +0800 CST

Innodb_buffer_pool_pages_free – Pode ser 1 ou 0?

  • 6

Tenho pesquisado neste tópico se o Innodb_buffer_pool_pages_free pode ser 0 ou não e ainda não tem impacto no site. Alguns administradores de banco de dados são da opinião de que Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total x 100 deve ser 5% ou mais, enquanto outros estão dizendo que pode ser 0, já que o banco de dados geralmente usará todo o tamanho do buffer pool e quando se tornar 0, as páginas LRU irão seja despejado e isso é igualmente rápido.

Vamos supor que as outras métricas estejam corretas, como a taxa de acerto do buffer pool está próxima de 100% e Innodb_buffer_pool_pages_flushed e Innodb_buffer_pool_pages_dirty estão baixas.

Innodb_buffer_pool_pages_free pode ser 0 ou 1?

No meu site, Innodb_buffer_pool_pages_free está caindo rapidamente em até 0,5% ao dia. Atualmente, a proporção de Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total x 100 é de 8,65% e está diminuindo. O tamanho total do buffer pool é de 96 GB. O site está funcionando bem, mas estou preocupado com o que acontecerá quando Innodb_buffer_pool_pages_free eventualmente se tornar 0 à medida que o site estiver crescendo.

mysql
  • 2 respostas
  • 21 Views
Martin Hope
mmrz1360
Asked: 2023-12-14 18:56:52 +0800 CST

O modelo de recuperação não pode ser alterado para SIMPLE quando algum arquivo estiver sujeito a uma operação RESTORE PAGE

  • 6

Uma das minhas páginas no banco de dados precisava ser restaurada. então fiz uma restauração com este comando:

USE master RESTORE DATABASE myDB PAGE = '1:4171728'FROM DISK = 'D:\Backups\Database\myDB.bak 'WITH NORECOVERY"

O problema com aquela página foi resolvido. Mas outro problema ocorreu. Não consigo fazer um backup ou alterar um modelo de recuperação. O erro é: "O backup do arquivo 'myDB' não é permitido porque contém páginas sujeitas a uma sequência de restauração online. Conclua a sequência de restauração antes de fazer o backup ou restrinja o backup para excluir este arquivo."

O que devo fazer?

Tentei DBCC CheckDB e sem erros. Banco de dados funciona bem. Mas não é possível realizar um backup nem alterar um modelo de recuperação.

sql-server
  • 2 respostas
  • 70 Views
Martin Hope
St.Mauro
Asked: 2023-12-14 17:17:47 +0800 CST

Compreendendo o baixo desempenho da verificação de heap de bitmap do PostgreSQL

  • 6

Estou tentando otimizar uma consulta lenta no PostgreSQL 15. A consulta é bastante complexa com muitos JOINs, um UNION e subconsultas, mas 99% do tempo de execução está no nó mais interno que verifica sequencialmente uma tabela de registros de 700K com uma condição LIKE. O tempo total de execução é de aproximadamente 15 segundos.

Extraindo a tabela e a condição WHERE da consulta:

SELECT * FROM orders WHERE tag ILIKE '%EJ080EJ%';

Gather  (cost=1000.00..18961.33 rows=27 width=454) (actual time=60.552..69.402 rows=0 loops=1)
Workers Planned: 3
Workers Launched: 3
->  Parallel Seq Scan on orders  (cost=0.00..17958.63 rows=9 width=454) (actual time=47.991..47.992 rows=0 loops=4)
      Filter: ((tag)::text ~~* '%EJ080EJ%'::text)
      Rows Removed by Filter: 74044
Planning Time: 0.732 ms
Execution Time: 69.439 ms

Então adicionei um índice usando a extensão GIN e pg_trgm que na minha experiência é útil com condições LIKE:

CREATE INDEX tmp_dba2 ON orders USING GIN (tag gin_trgm_ops);

Bitmap Heap Scan on orders(cost=18.91..48.84 rows=27 width=454) (actual time=0.061..0.062 rows=0 loops=1)
  Recheck Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
  ->  Bitmap Index Scan on tmp_dba2  (cost=0.00..18.90 rows=27 width=0) (actual time=0.060..0.060 rows=0 loops=1)
        Index Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
Planning Time: 0.947 ms
Execution Time: 0.090 ms

Até agora tudo bem. Enfim, executando toda a consulta o índice é usado mas o tempo de execução não muda tanto:

->  Bitmap Heap Scan on orders  (cost=19.22..94.62 rows=68 width=225) (actual time=13495.733..13495.740 rows=2 loops=1)
      Recheck Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
      Heap Blocks: exact=2
      Buffers: shared hit=21
      ->  Bitmap Index Scan on tmp_dba2  (cost=0.00..19.21 rows=68 width=0) (actual time=0.087..0.087 rows=2 loops=1)
            Index Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
            Buffers: shared hit=19

No meu (pobre) entendimento dos componentes internos do Postgres, isso significa que a varredura de índice recupera um bitmap das páginas heap que atendem à condição (2 registros) e, em seguida, a varredura heap lê as páginas para recuperar os dados (2 registros).

Não consigo entender por que a leitura de 2 registros leva 13 segundos, assim como uma varredura sequencial, então adicionar o índice parece inútil.

Alguém pode me ajudar a entender esse comportamento?

postgresql
  • 1 respostas
  • 47 Views
Martin Hope
user281945
Asked: 2023-12-14 12:13:08 +0800 CST

Passar um parâmetro para um arquivo SQL

  • 7

No Oracle temos um pequeno arquivo sql (truncate_table.sql) que chama uma função que trunca uma tabela:

BEGIN
  DBMS_OUTPUT.PUT_LINE('FuncTruncTable executing...');
     IF ( FuncTruncTable(upper('&1'))=FALSE) THEN
  DBMS_OUTPUT.PUT_LINE('FuncTruncTable failed');
     END IF;
END;
/

Pois &1, passamos schema_name.table_name. Percebo que os nomes das tabelas no PostgreSQL estão em letras minúsculas. Então, no PostgreSQL eu tentei

IF ( select FuncTruncTable(lower('&1'))=FALSE) THEN....;

Este arquivo SQL é chamado por um shell script ( truncate_single_table.sh) que basicamente se parece com isto

TableName=$1
LOG_FILE=/some_dir/log/truncate_log.txt
sqlplus user_name/user_pass @/some_dir/sql/truncate_table.sql $TableName > $LOG_FILE

truncate_single_table.shé chamado por outro script de shell truncate_tables.sh.

truncate_tables.shmonta um monte de tabelas e chama `truncate_single_table.sh para truncá-las uma por uma da seguinte forma:

. /some_dir/bin/truncate_single_table.sh schema_name.TABLE_1 NEW
. /some_dir/bin/truncate_single_table.sh schema_name.TABLE_2 APPEND
. /some_dir/bin/truncate_single_table.sh schema_name.TABLE_3 APPEND

e assim por diante.

NEWe APPENDsão usados ​​para contar as tabelas - o número de tabelas que devem ser truncadas deve corresponder ao número de tabelas realmente truncadas. Se ocorrer um erro, o trabalho envia um aviso porque (TotalNumber - number of errors) <> TotalNumber.

Estou tentando converter o processo para PostgreSQL. Sou totalmente novo no PostgreSQL. Simplesmente substituindo

sqlplus user_name/user_pass @/some_dir/sql/truncate_table.sql $TableName > $LOG_FILE

com

psql -d "dbname=$dbname user='user_name' password='user_pass' host=$HostName" -f /some_dir/sql/truncate_gnxsawork_table.sql $TableName > $LOG_FILE

não funciona.

Talvez devam ser usadas opções diferentes (além de -d, -f) que eu não conheço.

postgresql
  • 1 respostas
  • 28 Views
Prev
Próximo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve