文章目錄
- 問題描述
- 分析
- **問題原因分析**
- **解決方案**
- **1. 修正系統時間**
- **2. 檢查數據目錄完整性**
- **3. 重新初始化數據目錄**
- **4. 調整 MySQL 配置**
- **驗證與后續步驟**
- **注意事項**
- 其他說明
問題描述
mysql數據初始化失敗,發現系統時間是1970年,我將系統時間改成2025年,就能初始化成功了。
1970-01-01T01:44:08.999267Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.33) MySQL Community Server - GPL.
1970-01-01 09:45:01+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1.el8 started.
1970-01-01 09:45:01+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
1970-01-01 09:45:01+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1.el8 started.
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/mysqld.cnf' is ignored.
1970-01-01T01:45:03.045951Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
1970-01-01T01:45:03.049185Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.33) starting as process 1
1970-01-01T01:45:03.053492Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
1970-01-01T01:45:03.053523Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8mb3_general_ci' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead.
1970-01-01T01:45:03.074083Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
1970-01-01T01:45:03.338899Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
1970-01-01T01:45:03.348297Z 1 [ERROR] [MY-011096] [Server] No data dictionary version number found.
1970-01-01T01:45:03.348883Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
1970-01-01T01:45:03.349101Z 0 [ERROR] [MY-010119] [Server] Aborting
1970-01-01T01:45:03.949729Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.33) MySQL Community Server - GPL.
1970-01-01 09:46:04+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1.el8 started.
1970-01-01 09:46:05+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
1970-01-01 09:46:05+08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.33-1.el8 started.
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
mysqld: [Warning] World-writable config file '/etc/mysql/conf.d/mysqld.cnf' is ignored.
1970-01-01T01:46:06.744074Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
1970-01-01T01:46:06.747196Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.33) starting as process 1
1970-01-01T01:46:06.751486Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
1970-01-01T01:46:06.751518Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8mb3_general_ci' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead.
1970-01-01T01:46:06.771748Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
1970-01-01T01:46:07.034656Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
1970-01-01T01:46:07.044106Z 1 [ERROR] [MY-011096] [Server] No data dictionary version number found.
1970-01-01T01:46:07.044737Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
1970-01-01T01:46:07.044811Z 0 [ERROR] [MY-010119] [Server] Aborting
1970-01-01T01:46:07.644094Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.33) MySQL Community Server - GPL.
1970-01-01T01:46:06.771748Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
1970-01-01T01:46:07.034656Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
1970-01-01T01:46:07.044106Z 1 [ERROR] [MY-011096] [Server] No data dictionary version number found.
1970-01-01T01:46:07.044737Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
1970-01-01T01:46:07.044811Z 0 [ERROR] [MY-010119] [Server] Aborting
分析
根據你提供的日志和描述,系統時間錯誤確實可能導致 MySQL 初始化失敗。以下是詳細分析和解決方案:
問題原因分析
-
系統時間錯誤:
- 日志中顯示的時間戳為 1970-01-01(Unix 時間起點),表明系統時間未正確配置。MySQL 在初始化時會依賴系統時間進行以下操作:
- 數據字典版本驗證:MySQL 8.0 引入了新的數據字典(Data Dictionary),其元數據包含版本信息。如果系統時間錯誤(如設置為 1970 年),MySQL 可能無法正確解析這些信息,導致
No data dictionary version number found
錯誤。 - 文件時間戳一致性:MySQL 初始化時會檢查數據目錄中文件的時間戳。若系統時間錯誤,可能導致 MySQL 認為文件時間早于預期,從而觸發初始化失敗。
- 數據字典版本驗證:MySQL 8.0 引入了新的數據字典(Data Dictionary),其元數據包含版本信息。如果系統時間錯誤(如設置為 1970 年),MySQL 可能無法正確解析這些信息,導致
- 日志中顯示的時間戳為 1970-01-01(Unix 時間起點),表明系統時間未正確配置。MySQL 在初始化時會依賴系統時間進行以下操作:
-
配置或數據損壞:
- 如果系統時間錯誤導致 MySQL 無法正確讀取數據目錄中的文件(如
ibdata1
、ib_logfile*
等),可能引發數據字典初始化失敗。即使系統時間修正后,仍需檢查數據目錄是否損壞。
- 如果系統時間錯誤導致 MySQL 無法正確讀取數據目錄中的文件(如
解決方案
1. 修正系統時間
- 臨時修改(僅用于測試):
# 設置正確的時間和時區 sudo date -s "2025-06-20 15:35:00" sudo timedatectl set-timezone Asia/Shanghai
- 永久同步時間(推薦):
安裝并啟用 NTP 服務,確保系統時間自動同步:# 安裝 NTP sudo apt install ntp # Debian/Ubuntu sudo yum install ntp # CentOS/RHEL# 啟動并啟用 NTP 服務 sudo systemctl enable ntp --now
2. 檢查數據目錄完整性
-
手動檢查數據目錄:
確保 MySQL 數據目錄(通常是/var/lib/mysql
)權限和文件完整性:sudo chown -R mysql:mysql /var/lib/mysql sudo chmod -R 750 /var/lib/mysql
-
修復數據文件:
如果數據目錄損壞,可以嘗試使用mysqlcheck
工具修復:sudo mysqlcheck --all-databases --check-upgrade --auto-repair -u root -p
3. 重新初始化數據目錄
如果上述方法無效,可能需要重新初始化數據目錄:
-
備份現有數據(如有必要):
sudo cp -r /var/lib/mysql /var/lib/mysql_backup
-
刪除舊數據目錄:
sudo rm -rf /var/lib/mysql/*
-
重新初始化:
sudo mysqld --initialize --user=mysql
-
啟動 MySQL:
sudo systemctl start mysql
4. 調整 MySQL 配置
-
避免使用過時的字符集配置:
日志中提示utf8
將在未來版本中映射到utf8mb4
。更新my.cnf
配置文件:[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
-
移除廢棄參數:
日志中提示--skip-host-cache
已棄用,替換為:SET GLOBAL host_cache_size = 0;
驗證與后續步驟
-
檢查 MySQL 日志:
查看/var/log/mysql/error.log
或/var/log/mysqld.log
,確認是否仍有錯誤。 -
測試數據庫連接:
mysql -u root -p -e "SHOW DATABASES;"
-
監控系統時間:
使用ntpstat
或timedatectl
確保系統時間同步:timedatectl
注意事項
- 避免手動修改系統時間:長期依賴手動修改時間可能導致其他服務異常(如證書驗證失敗、日志混亂等)。務必使用 NTP 自動同步。
- 備份數據:在重新初始化數據目錄前,務必備份重要數據。
- 升級 MySQL:如果你使用的是較舊版本(如 8.0.33),建議升級到最新版本以修復潛在問題。
如果問題仍未解決,請提供完整的 MySQL 錯誤日志和 my.cnf
配置文件內容,以便進一步排查。
其他說明
上海107 ubuntu22.04 算能盒子硬件時鐘是有電的,能夠取得時間,但是初始時間未設置,為1970年,導致mysql數據初始化時失敗。
猜測之前的英偉達盒子,可能系統啟動的時候做了個判斷,如果硬件時間是1970年附近,就把硬件時鐘設置為2023年2月,所以一直沒問題。