MySQL安装后的设置和测试(参考MySQL官方文档)
本文讨论安装MySQL后应执行的任务:
如有必要,初始化数据目录并创建MySQL授权表。对于某些MySQL安装方式,以下安装方式可以自动进行数据目录初始化:
1、由MySQL安装程序执行的Windows安装操作。
2、使用Oracle的服务器RPM或Debian发行版在Linux上安装。
3、在许多平台上使用本机打包系统进行安装,包括Debian Linux、Ubuntu Linux、Gentoo Linux和其他平台。
4、使用DMG发行版在macOS上安装。
对于其他平台和安装类型,必须手动初始化数据目录。包括从Unix和Linux系统上的通用二进制和源码安装
一、初始化数据目录
安装MySQL后,必须初始化数据目录,包括MySQL系统数据库中的表:
对于某些MySQL安装方法,数据目录初始化是自动的,如之前所述。
对于其他安装方法,必须手动初始化数据目录。其中包括在Unix和Linux系统上使用二进制和源码安装,以及在Windows上从ZIP存档包安装。
如何为MySQL安装方法手动初始化数据目录,数据目录初始化不是自动的。有关一些建议的命令,这些命令可用于测试服务器是否可访问并正常工作。
1、数据目录初始化概述
1.示例中,使用mysql登录帐户运行。如果不存在,请创建帐户(请参见创建MySQL用户和组),或替换计划用于运行服务器的登录帐户的名称。
将位置更改为MySQL安装的目录,通常为/usr/local/MySQL(根据需要调整系统的路径名):
cd /usr/local/mysql
2.在该目录中,您将找到几个文件和子目录,包括服务器以及客户端和实用程序的bin目录。
secure_file_priv系统变量将导入和导出操作限制到特定目录。创建一个目录,该目录的位置可以指定为该变量的值:mkdir mysql-files
将目录用户和组所有权授予mysql用户和mysql组,并适当设置目录权限:
3.使用服务器初始化数据目录,包括mysql数据库,其中包含初始的mysql授予表,这些表确定如何允许用户连接到服务器。例如:
bin/mysqld --initialize --user=mysql
Typically, data directory initialization need be done only after you first install MySQL. (For upgrades to an existing installation, perform the upgrade procedure instead; see Section 2.11, “Upgrading MySQL”.) However, the command that initializes the data directory does not overwrite any existing mysql database tables, so it is safe to run in any circumstances.
通常,只有在首次安装MySQL之后才需要进行数据目录初始化。(对于升级现有安装,采用mysql升级的方式);
初始化数据目录的命令不会覆盖任何现有的MySQL数据库表,因此在任何情况下运行都是安全的。
注意
如果缺少所需的系统库,则数据目录的初始化可能会失败。可能会看到如下错误:
bin/mysqld: error while loading shared libraries:
libnuma.so.1: cannot open shared object file:
No such file or directory
发生这种情况,则必须手动或使用系统的包管理器安装丢失的库。然后重试数据目录初始化命令。
4.如果要部署自动支持安全连接的服务器,使用
mysql_ssl_rsa_setup,用于创建默认ssl和rsa文件:
bin/mysql_ssl_rsa_setup
5.如果没有任何选项文件,服务器将以其默认设置启动。若要显式指定MySQL服务器在启动时应使用的选项,请将它们放在选项文件中,如/etc/my.cnf或/etc/MySQL/my.cnf。
6.数据目录初始化在mysql数据库中创建时区表,但不填充它们。
2> 数据目录初始化过程
将位置更改为MySQL安装的目录,通常为/usr/local/MySQL(根据需要调整系统的路径名):
cd /usr/local/mysql
要初始化数据目录,可以使用--initialize或--initialize unsecure选项调用mysqld,具体使用哪个参数取决于希望服务器为“root”@“localhost”帐户生成随机的初始密码,还是创建不带密码的帐户:
使用--初始化“默认安全”安装(即生成随机的初始根密码)。在这种情况下,密码被标记为过期,您需要选择一个新密码。
使用--initialize unsecure,不会生成根密码。这是不安全的;要及时登录修改密码。
注意
服务器将任何消息(包括任何初始密码)写入其标准错误输出。这可能会被重定向到错误日志,因此如果您没有看到屏幕上的消息,请查看那里。
在Unix和Linux系统中,mysql登录帐户拥有的数据库目录和文件非常重要,这样服务器在以后运行时可以对它们进行读写访问。要确保这一点,请从系统根帐户启动mysqld并包括--user选项,如下所示:
bin/mysqld --initialize --user=mysql
bin/mysqld --initialize-insecure --user=mysql
或者,在以mysql登录时执行mysqld,在这种情况下,可以从命令中省略--user选项。
如果mysqld无法标识安装目录或数据目录的正确位置,则可能需要指定其他选项,如--basedir或--datadir。
bin/mysqld --initialize --user=mysql
--basedir=/opt/mysql/mysql
--datadir=/opt/mysql/mysql/data
或者,将相关的选项设置放在选项文件中,并将该文件的名称传递给mysqld。对于Unix和Linux系统,假设选项文件名是/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
3> 数据目录初始化期间的服务器操作
使用--initialize或--initialize unsecure选项时,mysqld在数据目录初始化期间执行以下操作:
1.服务器检查数据目录的存在情况:
•如果不存在数据目录,则服务器创建它。
•如果数据目录存在但不为空(即它包含文件或子目录),则服务器在产生错误消息后退出:
[ERROR] --initialize specified but the data directory exists. Aborting.
在这种情况下,请删除或重命名数据目录,然后重试。
对于MySQL 5.7.11,如果每个条目都有一个以(.)开头的名称,使用--ignore-db-dir参数忽略。
注意
避免使用--ignore db dir选项,该选项自MySQL 5.7.16以来就一直被弃用。
2.在data目录中,服务器创建mysql系统数据库及其表,包括grant表、时区表和服务器端帮助表。
3.服务器初始化管理InnoDB所需的系统表空间和相关数据结构表。
注意
mysqld设置InnoDB系统表空间之后,对表空间特性的某些更改需要设置一个全新的实例。
符合条件的更改包括系统表空间中第一个文件的文件名和撤消日志的数量。如果不想使用默认值,
请确保在运行mysqld之前,MySQL配置文件中已设置了innodb_data_file_path和innodb_log_file_size配置参数。还要确保根据需要指定影响InnoDB创建和位置的其他参数文件,
如innodb_data_home_dir和innodb_log_group_home_dir。
如果这些选项在配置文件中,但该文件不在MySQL默认读取的位置,请在运行mysqld时使用--defaults-extra file选项指定文件位置。
4.服务器创建一个“root”@“localhost”超级帐户和其他保留帐户。某些保留帐户已锁定,客户端无法使用,但“root”@“localhost”用于管理,可以为其分配密码。
与“root”@“localhost”帐户密码相关的操作取决于如何调用它:
•使用--initialize but not--initialize unsecure,服务器生成一个随机密码,将其标记为过期,并写入一条密码的消息:
•使用--initialize unsecure(无论是否使用--initialize,因为--initialize-unsecure意味着--initialize),服务器不会生成密码或将其标记为过期,并写入警告消息:
当服务器在引导模式下运行时,某些功能不可用,从而限制了文件中允许的语句。这些语句包括与帐户管理(例如创建用户或授予)、复制和全局事务标识符相关的语句。
4> 初始化后根密码分配
通过使用--initialize或--initialize-insecure启动服务器来初始化数据目录后,正常启动服务器,并为“root”@“localhost”帐户分配新密码:
•如果使用--initialize but not--initialize unsecure初始化数据目录,请以根用户身份连接到服务器:
mysql -u root -p
然后,在密码提示下,输入服务器在初始化过程中生成的随机密码:
Enter password: (enter the random root password here)
如果不知道此密码,请查看服务器错误日志。
•如果使用--initialize unsecure初始化数据目录,请以根用户身份连接到服务器
mysql -u root --skip-password
3.连接后,使用ALTER USER语句分配新的根密码:
ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘root-password‘;
Note
尝试连接到主机127.0.0.1通常解析为本地主机帐户。但是,如果服务器在启用跳过名称解析的情况下运行,则此操作将失败。
如果计划这样做,请确保存在一个帐户,可以接受连接。要能够使用--host=127.0.0.1或--host=::1以根用户身份连接,请创建以下帐户:
CREATE USER ‘root‘@‘127.0.0.1‘ IDENTIFIED BY ‘root-password‘;
CREATE USER ‘root‘@‘::1‘ IDENTIFIED BY ‘root-password‘;
二、启动服务器
1> 如果您的安装包含mysqld_safe,请这样启动MySQL服务器:
shell> bin/mysqld_safe --user=mysql &
注意
对于使用RPM包安装MySQL的Linux系统,服务器的启动和关闭是使用systemd而不是mysqld-safe来管理的,mysqld-safe没有安装。
如果安装包含systemd支持,请按如下方式启动服务器:
shell> systemctl start mysqld
如果服务名与mysqld不同(例如,SLES系统上的mysql),请替换相应的服务名。
使用非root登录帐户运行MySQL服务器非常重要。要确保这一点,请以root身份运行mysqld_safe,并包括--user选项,
否则,应该在以mysql登录执行该程序,在这种情况下,可以从命令中省略--user选项。
如果命令失败并打印mysqld ended,请在错误日志中查找信息(默认情况下,错误日志是数据目录中的host_name.err文件)。
如果服务器无法访问它启动的数据目录或读取mysql数据库中的grant表,则会将消息写入其错误日志。
如果在继续执行此步骤之前忽略了通过初始化数据目录来创建grant表,或者在没有--user选项的情况下运行初始化数据目录的命令,
则可能会发生此类问题。删除数据目录并使用--user选项运行命令。
2> 启动MySQL服务时的疑难解答
本节提供有关启动服务器问题的疑难解答建议
如果在启动服务器时遇到问题,请尝试以下操作:
•检查错误日志以了解服务器未启动的原因。日志文件位于数据目录中(通常是/usr/local/MySQL/data用于Unix/Linux二进制发行版,以及/usr/local/var用于Unix/Linux源发行版)。
在数据目录中查找名称格式为host_name.err和host_name.log的文件,其中host_name是服务器主机的名称。然后检查这些文件的最后几行。使用tail显示它们:
shell> tail host_name.err
shell> tail host_name.log
•指定正在使用的存储引擎所需的任何特殊选项。可以创建my.cnf文件,并为计划使用的引擎指定启动选项。
如果要使用支持事务(InnoDB、NDB)的存储引擎,请确保在启动服务器之前按照所需的方式对它们进行了配置。
尽管存储引擎对忽略的选项使用默认值,但建议检查可用选项,并为其默认值不适合安装的任何选项指定显式值。
•确保服务器知道在哪里找到数据目录。mysqld服务器将此目录用作其当前目录。这是它希望查找数据库和写入日志文件的位置。服务器还将pid(进程ID)文件写入数据目录。
编译服务器时,默认的数据目录位置是硬编码的。要确定默认路径设置是什么,请使用--verbose和--help选项调用mysqld。如果数据目录位于系统的其他位置,
请在命令行或选项文件中使用--datadir选项将该位置指定为mysqld或mysqld_safe。否则,服务器将无法正常工作。作为--datadir选项的替代选项,
可以指定mysqld使用--basedir安装MySQL的基本目录的位置,mysqld在其中查找数据目录。
要检查指定路径选项的效果,请使用这些选项调用mysqld,然后使用--verbose和--help选项。例如,如果将位置更改为安装mysqld的目录,然后运行以下命令,将显示使用/usr/local基目录启动服务器的效果:
shell> ./mysqld --basedir=/usr/local --verbose --help
还可以指定其他选项,例如--datadir,但是--verbose和--help必须是最后一个选项。
一旦确定了所需的路径设置,就可以启动服务器。
如果mysqld当前正在运行,则可以通过执行以下命令了解它正在使用的路径设置:
shell> mysqladmin variables
或:
shell> mysqladmin -h host_name variables
host_name是MySQL服务器主机的名称。
•确保服务器可以访问数据目录。数据目录及其内容的所有权和权限必须允许服务器读取和修改它们。
如果在启动mysqld时收到错误代码13(这意味着权限被拒绝),这意味着数据目录或其内容的权限不允许服务器访问。
在这种情况下,您可以更改相关文件和目录的权限,以便服务器有权使用它们。您也可以root用户启动服务器,但这会引发安全问题,应该避免。
将位置更改为数据目录,并检查数据目录的所有权及其内容,以确保服务器具有访问权限。例如,如果数据目录是/usr/local/mysql/var,请使用以下命令:
shell> ls -la /usr/local/mysql/var
如果数据目录或其文件或子目录不属于用于运行服务器的登录帐户,请将其所有权更改为该帐户。如果帐户名为mysql,请使用以下命令:
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql/var
即使拥有正确的所有权,如果系统上运行其他安全软件来管理对文件系统各个部分的应用程序访问,MySQL也可能无法启动。在这种情况下,请重新配置该软件,使mysqld能够访问在正常操作期间使用的目录。
•验证服务器要使用的网络接口是否可用。
如果出现以下任何一个错误,则意味着某些其他程序(可能是另一个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之前关闭服务器。
如果没有其他服务器正在运行,请执行命令telnet your_host_name tcp_ip_port_number。(默认的MySQL端口号是3306。)然后按Enter键几次。
如果未收到类似telnet的错误消息:无法连接到远程主机:连接被拒绝,其他程序正在使用mysqld试图使用的TCP/IP端口。跟踪这是什么程序并禁用它,
或者告诉mysqld使用--端口选项。在这种情况下,使用TCP/IP连接到服务器时,请为客户端程序指定其他非默认端口号。
端口不可访问的另一个原因是,您运行的防火墙阻止了与该端口的连接。如果是,请修改防火墙设置以允许访问端口。
如果服务器启动但无法连接,请确保在/etc/hosts中有一个如下所示的条目:
127.0.0.1 localhost
三、测试MySQL
在初始化数据目录并启动服务器之后,执行一些简单的测试以确保其正常工作。假设当前位置是MySQL安装目录,并且它有一个bin子目录,其中包含此处使用的MySQL程序。如果不是这样,请相应地调整命令路径名。
或者,将bin目录添加到PATH环境变量设置中。使命令解释器能够正确地查找MySQL程序,可以只键入程序名而不是路径名来运行程序。
使用mysqladmin验证服务器是否正在运行。以下命令提供了检查服务器是否已启动并响应连接的简单测试:
shell> bin/mysqladmin version
shell> bin/mysqladmin variables
如果无法连接到服务器,请指定-u root 选项作为根连接。如果已经为根帐户分配了密码,则还需要在命令行中指定-p并在提示时输入密码。例如:
shell> bin/mysqladmin -u root -p version
Enter password: (enter root password here)
mysqladmin版本的输出略有不同,这取决于您的平台和MySQL的版本,但应该与下面所示的类似:
shell> bin/mysqladmin version
mysqladmin Ver 14.12 Distrib 5.7.30, for pc-linux-gnu on i686
...
Server version 5.7.30
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选项调用它。
验证是否可以关闭服务器(如果根帐户已经有密码,请包括-p选项):
shell> bin/mysqladmin -u root shutdown
确认您可以再次启动服务器。通过使用mysqld_safe或直接调用mysqld来执行此操作。例如:
shell> bin/mysqld_safe --user=mysql &
运行一些简单的测试来验证是否可以从服务器检索信息:
shell> bin/mysqlshow
--------------------
| Databases |
--------------------
| information_schema |
| mysql |
| performance_schema |
| sys |
--------------------
已安装数据库的列表可能会有所不同,但始终至少包括mysql和information_schema。如果指定数据库名称,mysqlshow将显示数据库中表的列表:
shell> bin/mysqlshow mysql
Database: mysql
---------------------------
| Tables |
---------------------------
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| 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帐户
介绍如何为MySQL安装过程中创建的初始根帐户分配密码(如果尚未这样做)。
注意
•在Windows上,可以在使用MySQL安装程序安装期间执行此过程。
•在所有平台上,MySQL发行版都包括MySQL_secure_setup,这是一个命令行实用程序,可以自动执行MySQL安装的大部分过程。
•在所有平台上,MySQL Workbench都是可用的,并提供管理用户帐户的能力。
在下列情况下,可能已经为初始帐户分配了密码:
•在Windows上,使用MySQL安装程序执行的安装提供了指定密码的选项。
•使用macOS安装程序进行安装会生成初始随机密码,安装程序会在对话框中向用户显示该密码。
•使用RPM软件包进行安装时,会生成一个初始随机密码,该密码会写入服务器错误日志。
•使用Debian软件包的安装提供了分配密码的选项。
•对于使用mysqld——initialize手动执行的数据目录初始化,mysqld生成初始随机密码,将其标记为过期,并将其写入服务器错误日志。
初始mysql用户帐户及其访问权限。安装MySQL只创建一个“root”@“localhost”超级用户帐户,该帐户具有所有权限,可以执行任何操作。
如果根帐户的密码为空,则MySQL安装不受保护:任何人都可以以根用户身份连接到MySQL服务器,而无需密码,并被授予所有权限。
“root”@“LoalHOST”帐户在mysql.proxies_priv表中也有一行,它允许授予“@”的代理权限,也就是说,对于所有用户和所有主机。这使得根可以设置代理用户,以及将设置代理用户的权限委托给其他帐户。
要为初始MySQL根帐户分配密码,请使用以下过程。将示例中的根密码替换为要使用的密码。
初始根帐户可能有密码,也可能没有密码。
•如果根帐户存在已过期的初始随机密码,则使用该密码连接到根目录服务器,然后选择新密码。如果数据目录是使用mysqld——initialize(手动初始化)或使用安装程序初始化的,
则会出现这种情况,该安装程序在安装操作期间不提供指定密码的选项。因为密码存在,必须使用它连接到服务器。但是由于密码已过期,在您选择新密码之前,您不能将该帐户用于除选择新密码之外的任何目的。
1.如果不知道初始随机密码,请查看服务器错误日志。
2.使用密码以根用户身份连接到服务器:
shell> mysql -u root -p
Enter password: (enter the random root password here)
3.选择新密码以替换随机密码:
mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘root-password‘;
•如果根帐户存在但没有密码,则使用无密码连接到根目录服务器,然后分配密码。如果使用mysqld初始化数据目录——initialize-insecure,就会出现这种情况。
1.使用无密码以根用户身份连接到服务器:
shell> mysql -u root --skip-password
2.指定密码:
mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘root-password‘;
为根帐户分配密码后,无论何时使用该帐户连接到服务器,都必须提供该密码。例如,要使用mysql客户端连接到服务器,请使用以下命令:
shell> mysql -u root -p
Enter password: (enter root password here)
要使用mysqladmin关闭服务器,请使用以下命令:
shell> mysqladmin -u root -p shutdown
Enter password: (enter root password here)
五、自动启动和停止MySQL
启动和停止MySQL服务器的方法。通常,可以通过以下方式之一启动mysqld服务器:
•直接调用mysqld。这在任何平台上都有效。
•在Windows上,可以设置MySQL服务,该服务在Windows启动时自动运行。
•在Unix和Linux系统上,您可以调用mysqld_safe,它尝试确定mysqld的正确选项,然后使用这些选项运行mysqld。
•在支持systemd的Linux系统上,可以使用它来控制服务器。
•在使用System V-style运行目录(即/etc/init.d和运行级别特定的目录)的系统上,调用mysql.server。此脚本主要用于系统启动和关闭。它通常以mysql的名称安装。server脚本通过调用mysqld_safe来启动服务器。
•在macOS上,安装launchd守护程序以在系统启动时启用自动MySQL启动。守护进程通过调用mysqld_safe启动服务器。MySQL首选项窗格还提供通过系统首选项启动和停止MySQL的控件。
•在Solaris上,使用服务管理框架(SMF)系统来启动和控制MySQL的启动。
下表显示了哪个选项将从选项文件中读取的服务器和启动脚本分组。
Table 2.14 MySQL Startup Scripts and Supported Server Option Groups
表2.14 MySQL启动脚本和支持的服务器选项组
Script Option Groups
mysqld [mysqld], [server], [mysqld-major_version]
mysqld_safe [mysqld], [server], [mysqld_safe]
mysql.server [mysqld], [mysql.server], [server]
[mysqld-major_version]表示名称为[mysqld-5.6]和[mysqld-5.7]的组由版本为5.6.x、5.7.x等的服务器读取。此功能可用于指定在给定版本系列中服务器可以只读的选项。
为了向后兼容,mysql.server还读取[mysql_server]组,mysqld_safe也读取[safe_mysqld]组。应该更新选项文件,改为使用[mysql.server]和[mysqld_safe]组。