mysql服務器之初始化數據目錄(data)——手動創建data目錄報錯處理


msql服務器—data目錄簡介

mysql服務器的data目錄是我們保存數據庫對象數據的目錄。

data目錄在什么時候初始化?

MySQL安裝完成后,數據目錄必須初始化,包括MySQL系統架構(system schema)中的表。

  • 對於一些MySQL安裝方法,數據目錄初始化是自動的
  • 對於其他安裝方式,需要手動初始化數據目錄。這包括在Unix和Unix-like系統上從通用的二進制和源發行版安裝,以及在Windows上從ZIP壓縮包安裝。

注意:對於手動初始化數據目錄的安裝方式,最好不要通過新建文件夾的方式,而是通過mysqld命令手動初始化。因為初始化正常data目錄包含很多MySql系統的表比如mysql表。而通過新建文件夾方式創建的data目錄是空的,就算后續通過mysqld命令重新初始化,data目錄也可能還是空的。下圖為正確初始化的data目錄:

針對非自動初始化數據目錄的MySQL安裝方式,介紹如何手動初始化數據目錄。

數據目錄初始化概述

如果沒有任何選項文件,服務器將使用默認設置啟動。為了明確指定MySQL服務器在啟動時應該使用的選項,將它們放在一個選項文件中,如/etc/my.cnf或/etc/mysql/my.cnf。例如,您可以使用一個選項文件來設置secure_file_priv系統變量。

數據目錄初始化過程

1、命令行或dos窗口從location更改到MySQL安裝的頂級目錄,通常是/usr/local/mysql(根據需要調整系統的路徑名):
cd /usr/local/mysql

2、要初始化數據目錄(data directory),請使用--initialize--initialize-insecure選項調用mysqld,這取決於是希望服務器為'root'@'localhost'帳戶生成隨機初始密碼,還是創建沒有密碼的帳戶:

  • 使用--initialize進行“默認安全”安裝(即,包括生成隨機初始root密碼)。在這種情況下,密碼被標記為過期,您必須更改一個新的密碼。
  • 使用--initialize-insecure,不會生成root密碼。這是不安全的;假定您打算在將服務器投入生產使用之前及時為該帳戶分配密碼。
    注意:
  • --initialize--initialize-insecure選項官網描述:該選項用於通過創建數據目錄和填充MySQL系統模式中的表來初始化MySQL安裝。
  • 服務器將任何消息(包括任何初始密碼)寫入其標准錯誤輸出。這可能會被重定向到錯誤日志,所以如果在屏幕上沒有看到消息,請查看那里。

UnixUnix-like系統上,數據庫目錄和文件由mysql登錄帳戶擁有是很重要的,這樣當稍后運行服務器時,服務器就可以對它們進行讀寫訪問。為了確保這一點,從系統root帳戶啟動mysqld,並包括--user選項,如下所示:

bin/mysqld --initialize --user=mysql
bin/mysqld --initialize-insecure --user=mysql

或者,使用mysql登錄時執行mysqld,在這種情況下,可以省略命令中的——user選項。
在Windows上,使用以下命令之一:

bin\mysqld --initialize --console
bin\mysqld --initialize-insecure --console

如果mysqld無法識別安裝目錄或數據目錄的正確位置,可能需要指定其他選項,比如--basedir--datadir。例如(單行輸入命令):

bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/mysql --datadir=/opt/mysql/mysql/data

或者,將相關的選項設置放在一個選項文件中,並將該文件的名稱傳遞給mysqld。對於Unix和Unix-like系統,假設選項文件名為/opt/mysql/mysql/etc/my.cnf。把這些行放到文件中:

[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data

然后調用mysqld,如下所示(先使用--defaults-file選項在單行輸入命令):

bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf --initialize --user=mysql

在Windows上,假設C:\my.ini包含以下行:

[mysqld]
basedir=C:\\Program Files\\MySQL\\MySQL Server 8.0
datadir=D:\\MySQLdata

然后調用mysqld,如下所示(先使用——defaults-file選項在單行輸入命令):

bin\mysqld --defaults-file=C:\my.ini --initialize --console

數據目錄初始化過程中的服務器操作

1、當使用--initialize或--initialize-insecure選項調用mysqld時,在數據目錄初始化順序中執行以下操作:

  • 如果不存在數據目錄,則由服務器創建。
  • 如果數據目錄存在,但不是空的(即,它包含文件或子目錄),服務器在生成一個錯誤消息后退出:
[ERROR] --initialize specified but the data directory exists. Aborting.

在這種情況下,請刪除或重命名數據目錄,然后重試。如果每個條目的名稱都以句點(.)開頭,則允許現有數據目錄非空。

2、在數據目錄中,服務器創建mysql system schema及其表,包括數據字典表、授權表、時區表和服務器端幫助表。

3、服務器初始化系統表空間和管理InnoDB表所需的相關數據結構。
注意:在mysqld設置InnoDB system表空間后,某些對表空間特征的更改需要設置一個全新的實例。合格的更改包括系統表空間中第一個文件的文件名和撤消日志的數量。如果不希望使用默認值,請在運行mysqld之前確保MySQL配置文件中已經設置了innodb_data_file_pathinnodb_log_file_size配置參數。還要確保在必要時指定其他影響InnoDB文件創建和位置的參數,例如innodb_data_home_dirinnodb_log_group_home_dir
如果這些選項在您的配置文件中,但是該文件不在MySQL默認讀取的位置,那么在運行mysqld時使用--default -extra-file選項指定文件位置。

4、服務器會創建一個“root”@“localhost”超級用戶帳戶和其他保留帳戶。有些保留帳戶是鎖定的,不能被客戶端使用,但是'root'@'localhost'是用於管理使用的,應該給它分配一個密碼。
關於'root'@'localhost'帳戶密碼的服務器操作取決於你如何調用它:

  • 使用--initialize不使用--initialize-insecure,服務器生成一個隨機密碼,將其標記為過期,並寫入一條顯示密碼的消息:
    [Warning] A temporary password is generated for root@localhost:
    iTag*AfrH5ej
  • 使用--initialize-insecure,(無論使用還是不使用--initialize,因為--initialize-insecure意味着--initialize),服務器不會生成密碼或將其標記為過期,並寫入警告消息:
    [Warning] root@localhost is created with an empty password ! Please
    consider switching off the --initialize-insecure option.

5、服務器填充用於幫助語句的服務器端幫助表。服務器不填充時區表。

6、如果給定init_file系統變量來命名一個SQL語句文件,服務器將執行該文件中的語句。該選項允許您執行自定義引導序列。

7、系統退出。

初始化后的root密碼分配

在使用--initialize或--initialize-insecure啟動服務器來初始化數據目錄后,正常啟動服務器(也就是說,不使用上述任何一種選項),並為“root”@“localhost”帳戶分配一個新密碼:

1、啟動服務器。
2、連接到服務器:

  • 如果你使用--initialize但不使用--initialize-insecure來初始化數據目錄,以root身份連接到服務器:
    mysql -u root -p

然后,在密碼提示符下,輸入服務器在初始化順序中生成的隨機密碼(如果您不知道這個密碼,請查看服務器錯誤日志。):

    Enter password: (enter the random root password here)
  • 如果你使用--initialize-insecure來初始化數據目錄,不用密碼以root身份連接到服務器:
    mysql -u root --skip-password

3、連接完成后,使用ALTER USER語句分配一個新的root密碼:

   ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';

或者

update mysql.user set authentication_string=password('root') where user='root' and Host = 'localhost';

注意:
嘗試連接到主機127.0.0.1通常會解析到本地主機帳戶。但是,如果服務器在運行時啟用了skip_name_resolve,則會失敗。如果您計划這樣做,請確保存在一個可以接受連接的帳戶。例如,要使用--host=127.0.0.1或--host=::1以root用戶連接,請創建以下帳戶:

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';

可以使用init_file系統變量將這些語句放在一個文件中,如數據目錄初始化期間的服務器操作中如果給定init_file系統變量來命名一個SQL語句文件,服務器將執行該文件中的語句。該選項允許您執行自定義引導序列。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM