本节讨论安装MySQL后应执行的任务:
1、如有必要,初始化数据目录并创建MySQL授权表。对于一些MySQL安装方法,数据目录初始化可能会自动为您完成:
由MSI安装程序和MySQL配置程序执行的Windows安装操作。
安装在Linux使用从Oracle下载的服务器rpm或Debian发行。
在许多平台上使用本机打包系统安装,包括DebianLinux、UbuntuLinux、GentooLinux等。
使用DMG分布在macOS上安装。
对于其他平台和安装类型,您必须手动初始化数据目录。其中包括从Unix和类Unix系统上的通用二进制和源发行版安装,以及从Windows上的ZIP归档包安装。
2、启动服务器并确保可以访问它。
3、如果在数据目录初始化期间尚未这样做,请将密码分配给授权表中的初始root
帐户。密码可防止对MySQL服务器的未授权访问。
4、可选地,安排服务器在您的系统启动和停止时自动启动和停止。有关说明,请参阅“自动启动和停止MySQL”
5、或者,填充时区表以启用命名时区的识别。
安装MySQL后,必须初始化数据目录,包括mysql
系统schema中的表:
1、对于某些MySQL安装方法,数据目录初始化是自动的,
2、对于其他安装方法,您必须手动初始化数据目录。其中包括在Unix和类Unix系统上从通用二进制和源发行版安装,以及在Windows上从ZIP归档包安装。
本节介绍如何为非自动的MySQL安装方法手动初始化数据目录。
默认鉴权插件caching_sha2_password
,'root'@'localhost'
管理帐户使用默认caching_sha2_password
。
mysql_native_password(MySQL8.0之前的默认鉴权插件)仍然受支持,但从MySQL起默认禁用8.4.0从MySQL9.0.0起删除。
在此处显示的示例中,服务器打算在mysql登录帐户的用户ID下运行。如果帐户不存在,请创建该帐户(请参阅创建一个mysql用户和组),或者替换您计划用于运行服务器的不同现有登录帐户的名称。
1、 将位置更改为MySQL安装的顶级目录,这通常是/usr/local/mysql
的(根据需要调整系统的路径名):
cd /usr/local/mysql
在这个目录中,您可以找到几个文件和子目录,包括包含服务器的bin子目录,以及客户端和实用程序。
2、secure_file_priv系统变量将导入和导出操作限制在特定目录。创建一个目录,其位置可以指定为该变量的值:
mkdir mysql-files
将目录用户和组所有权授予mysql
用户和mysql
组,并适当设置目录权限:
chown mysql:mysql mysql-files
chmod 750 mysql-files
3、使用服务器初始化数据目录,包括mysql
schema包含确定如何允许用户连接到服务器的初始MySQL授权表。例如:
bin/mysqld --initialize --user=mysql
通常,数据目录初始化只需要在您第一次安装MySQL后完成。(对于现有安装的升级,请改为执行升级过程)但是,初始化数据目录的命令不会覆盖任何现有的mysqlschema表,因此在任何情况下运行都是安全的。
4、如果没有任何选项文件,服务器开头是其默认设置。要显式指定MySQL服务器在启动时应使用的选项,请将它们放在选项文件中,例如/etc/my.cnf或/etc/mysql/my.cnf。例如,您可以使用选项文件来设置secure_file_priv系统变量。
5、要安排MySQL在系统启动时无需人工干预即可启动,
6、数据目录初始化在mysql
中创建时区表schema但不填充它们。
将位置更改为MySQL安装的顶级目录,这通常是/usr/local/mysql
的(根据需要调整系统的路径名):
cd /usr/local/mysql
要初始化数据目录,调起mysqld与--initialize或--initialize-insecure选项,这取决于您是否希望服务器生成一个随机的初始密码为'root'@'localhost'帐户,或创建该帐户没有密码:
a、使用--initialize进行"安全默认"安装(即,包括生成随机的初始root密码)。在这种情况下,密码被标记为过期,您必须选择一个新的。
b、使用--initialize-insecure,不会生成root密码。这是不安全的;假设您打算在将服务器投入生产使用之前及时为帐户分配密码。
服务器将任何消息(包括任何初始密码)写入其标准错误输出。这可能会被重定向到错误日志,因此如果您在屏幕上看不到消息,请查看此处。有关错误日志的信息,包括它的位置,
在Windows上,使用--console选项将消息定向到控制台。
在Unix和类Unix系统上,数据库目录和文件必须由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
如果缺少所需的系统库,数据目录初始化可能会失败。例如,您可能会看到如下错误:
bin/mysqld: error while loading shared libraries:
libnuma.so.1: cannot open shared object file:
No such file or directory
如果发生这种情况,您必须手动或使用系统的包管理器安装缺失的库。然后重试数据目录初始化命令。
如果mysqld无法识别安装目录或数据目录的正确位置,则可能需要指定其他选项--basedir
或--datadir
。例如(在一行中输入命令):
bin/mysqld --initialize --user=mysql
--basedir=/opt/mysql/mysql
--datadir=/opt/mysql/mysql/data
或者,将相关的选项设置放在选项文件中,并将该文件的名称传递给mysqld。对于Unix和类Unix系统,假设选项文件名是/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.4
datadir=D:\\MySQLdata
然后调起mysqld如下(同样,您应该在一行中输入命令,首先输入--defaults-file选项):
bin\mysqld --defaults-file=C:\my.ini
--initialize --console
初始化数据目录时,除了用于设置目录位置的选项(如--basedir或--datadir)和--user选项(如果需要)之外,不应指定任何其他选项。MySQL服务器在正常使用期间使用的选项可以在初始化后重新启动时设置。有关详细信息,请参阅--initialize选项的描述。
服务器执行的数据目录初始化序列不能替代mysql_secure_installation执行的操作。
当使用--initialize或--initialize-insecure选项调用时,mysqld在数据目录初始化序列期间执行以下操作:
1、服务器检查数据目录是否存在,如下所示:
如果不存在数据目录,则服务器会创建它。
如果数据目录存在但不为空(即包含文件或子目录),服务器在产生错误消息后退出:
[ERROR] --initialize specified but the data directory exists. Aborting.
在这种情况下,请删除或重命名数据目录,然后重试。如果每个条目的名称都以句点(.
)开头,则允许存量数据目录为非空。
2、在数据目录中,服务器创建mysql
系统schema及其表,包括数据字典表、授权表、时区表和服务器端帮助表。
3、服务器初始化管理InnoDB表所需的系统表空间和相关数据结构。
在mysqld设置InnoDB 系统表空间后,对表空间特征的某些更改需要设置一个全新的实例。合格的更改包括系统表空间中第一个文件的文件名和撤消日志的数量。如果您不想使用默认值,请确保innodb_data_file_path和innodb_log_file_size配置参数的设置在MySQL配置文件 中到位,然后再运行mysqld。还要确保根据需要指定影响InnoDB文件创建和位置的其他参数,例如innodb_data_home_dirinnodb_log_group_home_dir.
如果这些选项在配置文件中,但该文件不在MySQL默认读取的位置,请在运行mysqld时使用--defaults-extra-file选项指定文件位置。
4、服务器创建一个'root'@'localhost'超级用户帐户和其他保留帐户。一些保留帐户被锁定,客户端无法使用,但'root'@'localhost'用于管理用途,您应该为其分配密码。
服务器关于'root'@'localhost'
帐户密码的操作取决于您如何调起它:
[Warning] A temporary password is generated for root@localhost:
iTag*AfrH5ej
[Warning] root@localhost is created with an empty password ! Please
consider switching off the --initialize-insecure option.
5、服务器填充用于HELP的服务器端帮助表。服务器不填充时区表。要手动执行此操作
6、如果使用init_file系统变量来命名包含SQL语句的文件,则服务器将执行该文件中的语句。
当服务器在引导模式下运行时,某些功能不可用,这些功能限制了文件中允许的语句。这些语句包括与帐户管理(如CREATE USER或GRANT)、复制和全局事务标识符相关的语句。
7、服务器退出。
通过使用--initialize或--initialize-insecure启动服务器初始化数据目录后,正常启动服务器(即不使用这些选项中的任何一个)并为'root'@'localhost'帐户分配新密码:
1、启动服务器。
2、连接到服务器:
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';
尝试连接到主机通常127.0.0.1解析为localhost帐户。但是,如果服务器在启用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';
本节介绍如何在Unix和类Unix系统上启动服务器。如果您的安装包括mysqld_safe,请像这样启动MySQL服务器:
$> bin/mysqld_safe --user=mysql &
对于使用rpm包安装MySQL的Linux系统,服务器启动和关闭使用systemd而不是mysqld_safe进行管理,并且没有安装mysqld_safe。
如果您的安装包含systemd支持,请像这样启动服务器:
$> systemctl start mysqld
如果与mysqld
不同,请替换相应的服务名称(例如,SLES系统上的mysql
)。
使用非特权(非root)登录帐户运行MySQL服务器非常重要。为确保这一点,请以root身份运行mysqld_safe并包含--user选项,如图所示。否则,您应该在已登录为mysql时执行程序,在这种情况下,您可以从命令中省略--user选项。
如果命令立即失败并打印mysqld ended
,请在错误日志中查找信息(默认为数据目录中的
文件)。host_name
.err
如果服务器无法访问它启动的数据目录或读取mysql
schema中的授权表,它就会向错误日志中写入消息。如果您在进行此步骤之前忽略了通过初始化数据目录来创建授权表,或者如果您在没有--user
选项的情况下运行初始化数据目录的命令,则可能会出现此类问题。删除data
目录并使用--user
选项运行命令。
如果您在启动服务器时遇到问题,可以尝试以下一些方法:
1、查看错误日志以了解服务器不启动的原因。日志文件位于数据目录(通常C:\Program Files\MySQL\MySQL Server 8.4\dataon Windows,/usr/local/mysql/data用于Unix/Linux二进制发行,/usr/local/var用于Unix/Linux源发行)。在数据目录中查找名称为host_name.err和host_name.log的文件,其中host_name是服务器主机的名称。然后检查这些文件的最后几行。使用tail显示它们:
$> tail host_name.err
$> tail host_name.log
2、指定您正在使用的存储引擎所需的任何特殊选项。您可以创建一个my.cnf
文件,并为您计划使用的引擎指定启动选项。如果您要使用支持事务表(InnoDB
、NDB)的存储引擎,请确保在启动服务器之前以您想要的方式配置它们。
尽管存储引擎对您省略的选项使用默认值,但Oracle建议您查看可用选项并为默认值不适合您安装的任何选项指定显式值。
3、确保服务器知道在哪里可以找到数据目录。mysqld服务器使用这个目录作为它的当前目录。这是它期望找到数据库的地方,也是它期望写入日志文件的地方。服务器还在数据目录中写入pid(进程ID)文件。
编译服务器时,默认的数据目录位置是硬编码的。要确定默认的路径设置是什么,请调起mysqld和--help选项。如果数据目录位于系统的其他位置,请在命令行或选项文件中使用--datadir选项将该位置指定给mysqld或mysqld_safe。否则,服务器将无法正常工作。作为--datadir选项的替代方法,您可以指定mysqld安装MySQL的基本目录的位置,mysqld将在其中查找数据目录。
要检查指定路径选项的效果,请用这些选项调起mysqld,后跟--verbose和--help选项。例如,如果您将位置更改为安装mysqld的目录,然后运行以下命令,它会显示使用/usr/local的基本目录启动服务器的效果:
$> ./mysqld --basedir=/usr/local --verbose --help
您也可以指定其他选项,例如--datadir,但--verbose和--help必须是最后一个选项。
一旦确定了所需的路径设置,就可以在不使用--verbose和--help的情况下启动服务器。
如果mysqld当前正在运行,您可以通过执行以下命令找出它使用的路径设置:
$> mysqladmin variables
或:
$> mysqladmin -h host_name variables
host_name
是MySQL服务器主机的名称。
4、确保服务器可以访问数据目录,数据目录及其内容的所有权和权限必须允许服务器读取和修改它们。
如果在启动mysqld时得到Errcode 13(表示Permission denied),这意味着数据目录或其内容的权限不允许服务器访问。在这种情况下,您更改所涉及文件和目录的权限,以便服务器有权使用它们。您也可以以root身份启动服务器,但这会引发安全问题,应该避免。
将位置更改为数据目录并检查数据目录及其内容的所有权,以确保服务器具有访问权限。例如,如果数据目录/usr/local/mysql/var
,请使用以下命令:
$> ls -la /usr/local/mysql/var
如果数据目录或其文件或子目录不属于您用于运行服务器的登录帐户,请将其所有权更改为该帐户。如果帐户名为mysql
,请使用以下命令:
$> chown -R mysql /usr/local/mysql/var
$> chgrp -R mysql /usr/local/mysql/var
即使拥有正确的所有权,如果您的系统上运行着其他管理文件系统各个部分应用权限的安全软件,MySQL也可能启动失败。在这种情况下,重新配置该软件以使mysqld能够访问它在正常操作期间使用的目录。
5、验证服务器想要使用的网络接口是否可用。
如果出现以下任一错误,则表示某个其他程序(可能是另一个mysqld服务器)正在使用mysqld尝试使用的TCP/IP端口或Unix套接字文件:
Can't start server: Bind on TCP/IP port: Address already in use
Can't start server: Bind on unix socket...
使用ps来判断你是否有另一个mysqld服务器在运行,如果是,在再次启动mysqld之前关停服务器。(如果另一个服务器正在运行,并且你真的想运行多个服务器,可参阅“在一台机器上运行多个MySQL实例”中找到有关如何操作的信息。)
如果没有其他服务器正在运行,请执行命令telnet your_host_name tcp_ip_port_number。(默认MySQL端口号为3306。)然后按几次Enter。如果您没有收到错误消息,例如telnet: Unable to connect to remote host: Connection refused,其他一些程序正在使用mysqld正在尝试使用的TCP/IP端口。跟踪这是什么程序并禁用它,或者告诉mysqld使用--port选项监听不同的端口。在这种情况下,使用TCP/IP连接到服务器时,为客户端程序指定相同的非默认端口号。
该端口可能无法访问的另一个原因是您正在运行的防火墙阻止了与它的连接。如果是这样,请修改防火墙设置以允许访问该端口。
如果服务器启动但无法连接,请确保/etc/hosts
中的条目如下所示:
127.0.0.1 localhost
如果无法启动mysqld,请尝试使用--debug选项创建跟踪文件以查找问题。
初始化数据目录并启动服务器后,执行一些简单的测试以确保其工作令人满意。本节假定您的当前位置是MySQL安装目录,并且它有一个包含此处使用的MySQL程序的bin
子目录。如果不是这样,请相应地调整命令路径名称。
或者,将bin目录添加到您的PATH环境变量设置中。这使您的shell(命令解释器)能够正确查找MySQL程序,以便您可以通过只键入程序名称而不是路径名称来运行程序。请参阅“设置环境变量”。
使用mysqladmin验证服务器是否正在运行。以下命令提供简单的测试来检查服务器是否已启动并响应连接:
$> bin/mysqladmin version
$> bin/mysqladmin variables
如果无法连接到服务器,请指定-u root
选项以root
身份连接。如果已经为root
帐户分配了密码,则还需要在命令行上指定-p
,并在出现提示时输入密码。例如:
$> bin/mysqladmin -u root -p version
Enter password: (enter root password here)
根据您的平台和MySQL版本,mysqladmin版本的输出略有不同,但应该与此处显示的相似:
$> bin/mysqladmin version
mysqladmin Ver 14.12 Distrib 8.4.3, for pc-linux-gnu on i686
...
Server version 8.4.3
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 14 days 5 hours 5 min 21 sec
Threads: 1 Questions: 366 Slow queries: 0
Opens: 0 Flush tables: 1 Open tables: 19
Queries per second avg: 0.000
要查看您还可以使用mysqladmin做什么,请使用--help选项调起它。
验证您是否可以关停服务器(如果root
帐户已经有密码,请包含-p
选项):
$> bin/mysqladmin -u root shutdown
确认您可以再次启动服务器。通过使用mysqld_safe或直接调用mysqld来做到这一点。例如:
$> bin/mysqld_safe --user=mysql &
如果mysqld_safe失败,请参阅上述“启动MySQL服务器的问题排除”。
运行一些简单的测试来验证您是否可以从服务器检索信息。输出应与此处显示的相似。
使用mysqlshow查看存在哪些数据库:
$> bin/mysqlshow
+--------------------+
| Databases |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
已安装数据库的列表可能会有所不同,但始终至少包括mysql
和information_schema
。
如果指定库名,mysqlshow将显示数据库中的表列表:
$> bin/mysqlshow mysql
Database: mysql
+---------------------------+
| Tables |
+---------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
使用mysql程序从mysqlschema的表中选择mysql:
$> bin/mysql -e "SELECT User, Host, plugin FROM mysql.user" mysql
+------+-----------+-----------------------+
| User | Host | plugin |
+------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+
通常,您可以通过以下方式之一启动mysqld服务器:
1、直接调起mysqld。这适用于任何平台。
2、在Windows上,您可以设置在Windows启动时自动运行的MySQL服务。
3、在Unix和类Unix系统上,您可以调起mysqld_safe,它会尝试确定mysqld的正确选项,然后使用这些选项运行它。
4、在Linux支持systemd的系统上,您可以使用它来控制服务器。
5、在使用System V样式运行目录(即/etc/init.d和运行级特定目录)的系统上,调起mysql. server。该脚本主要用于系统启动和关闭。它通常以mysql的名称安装。mysql.server脚本通过调用mysqld_safe来启动服务器。
6、在macOS上,安装一个启动守护程序,以便在系统启动时启用自动MySQL启动。守护程序通过调用mysqld_safe来启动服务器。
7、在Solaris上,使用服务管理框架(SMF)系统来启动和控制MySQL启动。
systemd、mysqld_safe和mysql. server脚本、Solaris SMF和macOS启动项(或MySQL首选项窗格)可用于手动启动服务器,或在系统启动时自动启动服务器。systemd、mysql.server和启动项也可用于停止服务器。
下表显示了从选项文件中读取的服务器和启动脚本的选项组。
表2.14MySQL启动脚本和支持的服务器选项组
Script | Option Groups |
---|---|
mysqld | [mysqld] , [server] , [mysqld- |
mysqld_safe | [mysqld] , [server] , [mysqld_safe] |
mysql.server | [mysqld] , [mysql.server] , [server] |
[mysqld-
意味着名称为major_version
][mysqld-8.3]
和[mysqld-8.4]
的组由具有8.3. x、8.4.x等版本的服务器读取。此特征可用于指定给定发布系列中只能由服务器读取的选项。
后向兼容性,mysql. server也读取[mysql_server]组,mysqld_safe也读取[safe_mysqld]组。要更新选项文件以使用[mysql.server]和[mysqld_safe]组。