Mariadb

MariaDB - MySQL - ALL-DB 導入 - 表“使用者”已經存在

  • February 11, 2021

我正在嘗試從本地 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轉儲文件的頂部:

DROP TABLE IF EXISTS `mysql`.`global_priv`;
DROP VIEW IF EXISTS `mysql`.`user`;

我遇到過類似的問題,這個問題似乎與 MariaDB 版本有關。也就是說,從 MariaDB 10.4 開始,mysql.user表已被視圖替換,而真實數據在新mysql.global_priv表中。這會導致 DROP TABLE 失敗,進而導致 CREATE TABLE 失敗。

添加--ignore-table=mysql.user到轉儲中會產生一個完美執行的文件,而不是不轉移使用者。

不幸的是, 和 的結構mysql.user非常mysql.global_priv不同,如果使用者數量很少並且權限不太複雜,最好手動重新創建使用者和權限。

引用自:https://dba.stackexchange.com/questions/266480