Mariadb
MariaDB - MySQL - ALL-DB 導入 - 表“使用者”已經存在
我正在嘗試從本地 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
不同,如果使用者數量很少並且權限不太複雜,最好手動重新創建使用者和權限。