我正在尝试从本地 MariaDB 迁移到 Docker 版本,这本质上应该像迁移到新的 SQL Server 一样简单。我已经很好地设置了 Docker 容器,但似乎无法导入我的“所有数据库”转储。
这就是我得到的:
mysql -u root -p < mariadb_alldb_*.sql
Enter password:
ERROR 1050 (42S01) at line 8022: Table 'user' already exists
通过以下方式生成转储:
mysqldump -u root -p --all-databases --skip-lock-tables > mariadb_alldb_"$(date '+%F')".sql
更新:每次都在一个新的 docker 容器上运行,并且我在从中导入的目录中创建了备份。
ls * | grep mariadb_alldb_
mariadb_alldb_2020-05-04.sql
Update2:也许它与我的 docker 设置有关?
这是我的 docker cmd:
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
我正在从本地机器进行此导入,我已经从容器内部复制了结果。
正如有人已经提到的,这与
mysql.user
在 10.4 中将表更改为视图有关。问题和解决方案记录在 MariaDB 网站的MDEV-22127中。解决方案是简单地将以下两行添加到
all-dbs.sql
转储文件的顶部:我遇到过类似的问题,这个问题似乎与 MariaDB 版本有关。也就是说,从 MariaDB 10.4 开始,
mysql.user
表已被视图替换,而真实数据在新mysql.global_priv
表中。这会导致 DROP TABLE 失败,进而导致 CREATE TABLE 失败。添加
--ignore-table=mysql.user
到转储中会产生一个完美运行的文件,而不是不转移用户。不幸的是, 和 的结构
mysql.user
非常mysql.global_priv
不同,如果用户数量很少并且权限不太复杂,最好手动重新创建用户和权限。解决方案是两倍。我使用了一个脚本来转储除模式之外的“所有数据库”并转储用户。
问题,仅供参考是 mysql.user 表和与锁有关的东西......
“所有数据库转储”-> https://dba.stackexchange.com/a/69667/113202
进口:
用户转储:--> https://serverfault.com/questions/8860/how-can-i-export-the-privileges-from-mysql-and-then-import-to-a-new-server/399875# 399875
进口:
现在到我的下一个问题,所有用户主机名 = localhost -->
复制 MySQL 用户但更改主机名
开始使用 docker image mariadb:10.3,在那里进行导入,然后将数据升级到更新的图像。这将保留您的权限。