Estou tentando migrar do MariaDB local para a versão do Docker, que deve ser tão simples quanto migrar para um novo SQL Server. Eu configurei o contêiner do Docker bem, mas não consigo importar meu despejo de "todos os bancos de dados".
Isto é o que eu recebo:
mysql -u root -p < mariadb_alldb_*.sql
Enter password:
ERROR 1050 (42S01) at line 8022: Table 'user' already exists
Despejo gerado via:
mysqldump -u root -p --all-databases --skip-lock-tables > mariadb_alldb_"$(date '+%F')".sql
Atualização: Isso é executado em um novo contêiner docker toda vez e eu criei backups em um diretório do qual estou importando.
ls * | grep mariadb_alldb_
mariadb_alldb_2020-05-04.sql
Update2: Talvez esteja relacionado à configuração do meu docker?
Aqui está o meu cmd docker:
docker stop mariadb && docker rm mariadb
docker run -d --name="mariadb" \
-p 3306:3306 \
-e TZ="America/Whitehorse" \
-v "/opt/mariadb/conf/conf.d":"/etc/mysql/conf.d" \
-v "/opt/mariadb/backups":"/mnt/" \
--mount type=volume,dst=/var/run/mysqld,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/var/run/mysqld \
mariadb:latest
Estou fazendo essa importação da máquina local, reproduzi resultados de dentro do container.
Como alguém já mencionou, isso tem a ver com a
mysql.user
tabela sendo alterada para uma visão em 10.4. O problema e a solução estão documentados no site do MariaDB em MDEV-22127 .A solução é simplesmente adicionar as duas linhas a seguir ao topo do seu
all-dbs.sql
arquivo de despejo:Eu encontrei um problema semelhante, e o problema parece ter a ver com a versão do MariaDB. Ou seja, a partir do MariaDB 10.4, a
mysql.user
tabela foi substituída por uma visualização, enquanto os dados reais estão na novamysql.global_priv
tabela. Isso faz com que DROP TABLE falhe, o que, por sua vez, faz com que CREATE TABLE falhe.Adicionar
--ignore-table=mysql.user
ao dump resulta em um arquivo que funciona perfeitamente, além de não transferir os usuários.Infelizmente, as estruturas de
mysql.user
emysql.global_priv
são diferentes o suficiente para que, se a contagem de usuários for pequena e as permissões não forem muito complexas, é melhor apenas recriar manualmente os usuários e privilégios.A solução foi dupla. Eu usei um script para despejar "todos os bancos de dados", exceto o esquema e despejar os usuários.
O problema, apenas para sua informação, era a tabela mysql.user e algo a ver com bloqueios ...
"All-DB Dump" --> https://dba.stackexchange.com/a/69667/113202
Importar:
Dump de usuários: --> https://serverfault.com/questions/8860/how-can-i-export-the-privileges-from-mysql-and-then-import-to-a-new-server/399875# 399875
Importar:
Agora, na minha próxima edição, todos os usuários hostname = localhost -->
Copie o usuário do MySQL, mas altere o nome do host
Comece a usar a imagem docker mariadb:10.3, faça a importação lá e depois execute a atualização de dados para uma imagem mais recente. Isso manterá suas permissões.