No Postgres 9.x, para uma coluna do tipo UUID
, como especifico um UUID para ser gerado automaticamente como valor padrão para qualquer inserção de linha?
Eu tenho esse enorme dump SQL de 32 GB que preciso importar para o MySQL. Eu não tive que importar um dump SQL tão grande antes. fiz o normal:
mysql -uroot dbname < dbname.sql
Está demorando muito. Há uma tabela com cerca de 300 milhões de linhas, chegou a 1,5 milhão em cerca de 3 horas. Então, parece que a coisa toda levaria 600 horas (ou seja, 24 dias) e é impraticável. Então, minha pergunta é, existe uma maneira mais rápida de fazer isso?
Mais informações/descobertas
- As tabelas são todas InnoDB e não há chaves estrangeiras definidas. Existem, no entanto, muitos índices.
- Eu não tenho acesso ao servidor original e ao banco de dados, então não posso fazer um novo backup ou fazer uma cópia "quente" etc.
- A configuração
innodb_flush_log_at_trx_commit = 2
sugerida aqui parece não fazer nenhuma melhoria (claramente visível/exponencial). - Estatísticas do servidor durante a importação (do MySQL Workbench): https://imgflip.com/gif/ed0c8 .
- A versão do MySQL é a comunidade 5.6.20.
- innodb_buffer_pool_size = 16M e innodb_log_buffer_size = 8M. Preciso aumentar estes?
Isso está me deixando louco!
Quero renomear uma coluna de read-more para read_more na minha tabela de blog
Eu tentei tudo isso:
ALTER TABLE blog RENAME COLUMN read-more to read_more;
ALTER TABLE blog CHANGE COLUMN 'read-more' 'read_more' VARCHAR(255) NOT NULL;
E eu sempre entendo isso!
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 'COLUMN read-more to read_more' at line 1
Estou usando o MySQL 5.5
Eu tenho uma coluna data
do tipo json
que contém documentos JSON como este:
{
"name": "foo",
"tags": ["foo", "bar"]
}
Gostaria de transformar a tags
matriz aninhada em uma string concatenada ( 'foo, bar'
). Isso seria facilmente possível com a array_to_string()
função em teoria. No entanto, esta função não aceita json
entrada. Então eu me pergunto como transformar esse array JSON em um array Postgres (type text[]
)?
Estou apenas confuso sobre como funcionam o Sharding e a Replication.
De acordo com as definições que encontrei na documentação:
Replicação: Um conjunto de réplicas no MongoDB é um grupo de processos mongod que mantêm o mesmo conjunto de dados.
Sharding: Sharding é um método para armazenar dados em várias máquinas.
De acordo com meu entendimento, se eu tiver 75 GB de dados, usando a replicação (3 servidores), ele armazenará 75 GB de dados em cada servidor significa 75 GB no Servidor-1, 75 GB no servidor-2 e 75 GB no servidor-3. (me corrija se eu estiver errado).
E usando o sharding, ele será armazenado como dados de 25 GB no servidor-1, dados de 25 GB no servidor-2 e dados de 25 GB no servidor-3. (Certo?).
Mas então eu encontrei esta linha no tutorial:
Os fragmentos armazenam os dados. Para fornecer alta disponibilidade e consistência de dados, em um cluster fragmentado de produção, cada fragmento é um conjunto de réplicas
Como um conjunto de réplicas tem 75 GB de tamanho, mas o shard tem 25 GB de tamanho, como eles podem ser equivalentes?
Isso me deixa bastante confuso. Acho que estou perdendo algo óbvio. Por favor me ajude com isso.
É uma má prática sempre criar uma transação?
Por exemplo, é uma boa prática criar uma transação para nada além de um simples SELECT
?
Qual é o custo de criar uma transação quando ela não é realmente necessária?
Mesmo se você estiver usando um nível de isolamento como READ UNCOMMITTED
, é uma prática ruim?
O MySQL SHOW GRANTS
mostra as permissões do usuário atual.
Existe uma maneira de fazer login como root e mostrar as permissões de todos os usuários?
Se eu tiver uma tabela com as colunas:
id | name | created_date
e gostaria de adicionar uma coluna, eu uso:
alter table my_table add column email varchar(255)
Em seguida, a coluna é adicionada após a created_date
coluna.
Existe alguma maneira de especificar a posição da nova coluna? por exemplo, para que eu possa adicioná-lo depois name
e obter uma tabela como:
id | name | email | created_date
Então, eu sou bastante novo para ajustar o InnoDB. Estou mudando lentamente as tabelas (quando necessário) de MyIsam para InnoDB. Eu tenho cerca de 100 MB no innodb, então aumentei a innodb_buffer_pool_size
variável para 128 MB:
mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)
Quando fui alterar o innodb_log_file_size
valor (exemplo my.cnf na página de configuração do mysql do innodb comentários para alterar o tamanho do arquivo de log para 25% do tamanho do buffer. Então agora meu my.cnf está assim:
# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
Quando reinicio o servidor, recebo este erro:
110216 9:48:41 InnoDB: Inicializando buffer pool, tamanho = 128.0M
110216 9:48:41 InnoDB: Inicialização completa do buffer pool
InnoDB: Erro: arquivo de log ./ib_logfile0 é de tamanho diferente 0 5242880 bytes
InnoDB: do que o especificado em o arquivo .cnf 0 33554432 bytes!
110216 9:48:41 [ERRO] A função de inicialização do plug-in 'InnoDB' retornou um erro.
110216 9:48:41 [ERRO] Falha no registro do plug-in 'InnoDB' como STORAGE ENGINE.
Então, minha pergunta: é seguro excluir os log_files antigos ou existe outro método para alterar a innodb_log_file_size
variável?
Estou interessado principalmente em MySQL e PostgreSQL, mas você pode responder o seguinte em geral:
- Existe um cenário lógico no qual seria útil distinguir uma string vazia de NULL?
Quais seriam as implicações de armazenamento físico para armazenar uma string vazia como...
- NULO?
- Cadeia vazia?
- Outro campo?
- Qualquer outra maneira?