做網(wǎng)站要學java嗎網(wǎng)站seo 工具
MySQL從5.7升級到8.0步驟及其問題
前言
本文源自微博客,且以獲得授權,請尊重版權。
一、需求背景
?????Docker環(huán)境下,MySQL5.7升級到8.0,數(shù)據(jù)遷移時使用的是mysqldump
方式遷移。
二、遷移步驟
-
數(shù)據(jù)備份:
docker exec -i 16aa739ca354 mysqldump -u root -p < /home/data/mysql_data_back/backup.sql
或者先進入到容器內部,然后進入目錄:
/usr/bin/
(mysqldump所在目錄),然后執(zhí)行:mysqldump -u root -p < /home/data/mysql_data_back/backup.sql
-
docker拉新的鏡像然后創(chuàng)建容器
-
數(shù)據(jù)恢復:
-
復制數(shù)據(jù)到容器中:
docker cp /home/data/mysql_data_back/backup.sql 16aa739ca354:/tmp/
-
恢復數(shù)據(jù):
docker exec -i 16aa739ca354 mysql -u root -p < /tmp/backup.sql
-
三、問題
?????在執(zhí)行最后一步的數(shù)據(jù)恢復過程中,出現(xiàn):ERROR 3554 (HY000) at line 318: Access to system table 'mysql.innodb_index_stats' is rejected.
四、分析
?????這個錯誤通常表示正在嘗試導入一個包含對系統(tǒng)表(如 mysql.innodb_index_stats
)的訪問或修改操作的 SQL 文件,但當前用戶沒有足夠的權限來執(zhí)行這些操作。
?????在 MySQL 中,系統(tǒng)表(如 mysql.innodb_index_stats
)通常是為 MySQL 服務器內部使用而保留的,并且不應該由普通用戶直接訪問或修改。
?????導出的sql語句也印證了這個情況:
五、解決
?????經過上述分析,我們知道出現(xiàn)這個問題的根本原因就是因為我們執(zhí)行了一些包含mysql.innodb_index_stats
的語句,那么就可以對癥下藥了,有兩個解決方案:
- 刪掉其中關于
mysql.innodb_index_stats
的語句:-- -- Table structure for table `innodb_index_stats` --DROP TABLE IF EXISTS `innodb_index_stats`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `innodb_index_stats` (`database_name` varchar(64) COLLATE utf8_bin NOT NULL,`table_name` varchar(199) COLLATE utf8_bin NOT NULL,`index_name` varchar(64) COLLATE utf8_bin NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`stat_name` varchar(64) COLLATE utf8_bin NOT NULL,`stat_value` bigint(20) unsigned NOT NULL,`sample_size` bigint(20) unsigned DEFAULT NULL,`stat_description` varchar(1024) COLLATE utf8_bin NOT NULL,PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0; /*!40101 SET character_set_client = @saved_cs_client */;-- -- Dumping data for table `innodb_index_stats` --LOCK TABLES `innodb_index_stats` WRITE; /*!40000 ALTER TABLE `innodb_index_stats` DISABLE KEYS */; INSERT INTO `innodb_index_stats` VALUES (...); /*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */; UNLOCK TABLES;
- 修改
數(shù)據(jù)備份語句
為:mysqldump -u root -p --all-databases --ignore-table=mysql.innodb_index_stats --ignore-table=mysql.innodb_table_stats > dump.sql
然后重新導入即可解決。