1 问题
当你调用 mysql 命令但是没有指定任何选项时,程序自动退出并返回 'access denied' 提示。
2. 解决方案
使用 mysql 命令连接数据库时必须指定连接参数。你可以通过命令行、选项文件或者结合这两种方式一起来实现。
3. 讨论
如果你 调用 mysql 命令时不使用任何命令选项,你将得到 'access denied' 错误。为了解决该问题,你需要按照下列方式使用 mysql 命令:
mysql -h localhost -u cbuser -p
上述的每个选项都是单 - 的形式:
-h 用于指定主机名;-u 用于指定用户名;-p 用于提示用户输入密码。
实际上,对于 MySQL 数据库的程序(如:mysql , mysqldump 以及 mysqladmin ),其支持的绝大多数选项还有一种对应的双 - 形式。例如,上述 mysql 命令可以写成如下形式:
mysql --host=localhost --user=cbuser --password
如果想要查看 mysql 命令支持的所有选项,可以使用下列命令:
mysql --help
同样地,如上所述,其他 MySQL 应用程序如 mysqldump 和 mysqladmin 也支持一样的方式来指定选项。例如,为了备份数据库 cookbook 中的所有数据表并将数据保存在 dump 文件中,可以按照下列方式使用 mysqldump :
mysqldump -h localhost -u cbuser -p cookbook > cookbook.sql
有些操作需要 MySQL 管理员账户来执行。mysqladmin 程序可以执行只有 MySQL 的 root 用户才能进行的操作。例如,如果想停止 MySQL 的服务端,可以按照下列方式调用 mysqladmin :
mysqladmin -h localhost -u root -p shutdown
如果选项后使用的值和该选项的默认值相同,那么可以直接省略该选项。例如,如果你希望连接的数据库服务器就在本机上,那么你就可以省略 -h localhost :
mysql -u cbuser -p
需要注意的是,不存在默认的密码。虽然你可以通过 -p password 或 --password= password 的方式直接在命令行指定密码,但实际中并不推荐这么做,因为在多用户系统下,其他用户可以通过 ps 等查看当前机器上进程的方式看到你的密码。
3.1 使用选项文件指定连接参数
如果你希望自己指定默认的连接参数,那么你可以将选项和对应的值放在选项文件中,这样可以使得:
- 对于放入文件中的选项,你就不需要每次都在命令行中指定;
- 可以混用通过命令行和文件指定的选项,通过这样的方式,你既可以将最常用的一些选项放入文件中,也可以同时在命令行中再次指定,以实现最终以命令行中的参数值为准。
选项文件本身是纯文本文件:
-
在 Unix 下,你的个人选项文件是在你家目录下名为 .my.cnf 的文件。同样,也有管理员用于为所有用户指定的全局选项文件,这样的全局性文件一般存在于 /etc 或 /etc/mysql ,又或者 MySQL 安装目录的 etc 目录下。 -
在 Windows 下,选项文件一般在 MySQL 安装目录(C:\Program Files\MySQL\MySQL Server 5.6 )的 my.ini 或者 my.cnf 中。
下面的例子显示了 MySQL 选项文件的格式:
# 客户端程序相关的通用连接选项
[client]
host = localhost
user = cbuser
password = cbpass
# 特定 mysql 程序对应的选项
[mysql]
skip-auto-rehash
pager="/usr/bin/less -E" # 指定交互模式下使用的翻页命令
在选项文件的内容如上述 [client] 组中一样指定时,你可以直接使用 mysql 就能以用户名 cbuser 登录,而不需要在命令行指定其他选项了。
MySQL 的选项文件还具有下列特征:
-
选项是按照组(或者叫块)进行分类的。选项组的第一行使用方括号指定了组名,剩下的各行指定了和该组相关的选项。上述的选项文件就显示了 [client] 和 [mysql] 两个组。如果还希望指定用于服务端的的选项,那么可以将对应选项放在名为 [mysqld] 的组中; -
通常用于指定客户端连接参数的组名是 [client] 。这个组中的参数除了对 mysql 有效以外,还对 mysqldump 以及 mysqladmin 有效; -
在同一个选项文件中可以定义多个组。如上述的案例所述,其中定义了 [client] 以及 [mysql] 两个组; -
在同一个组中,编写选项的格式是 name = value ,其中 name (不带任何 - )表示选项名而 value 代表选项值。如果一个选项不接受值(如上述的 skip-auto-rehash ),那么直接使用选项名称即可; -
在选项文件中,仅允许使用长型选项而不允许使用短型选项。例如,在命令行中,你既可以使用 -h hostname 也可以使用 --host = hostname 来指定主机名,但是在选项文件中只可以使用 host =hostname ; -
包括 mysql 和 mysqld 在内的许多程序除了有命令选项外还有程序变量(对于服务器来说叫做系统变量)。程序变量也可以像选项一样在选项文件中指定。在程序内部,程序变量中会使用下划线 _ ,但是在选项文件中,针对选项名或者变量,既可以使用 - 也可以使用 _ 。例如, skip-auto-rehash 和 skip_auto_rehash 是等价的;为了设定服务器的 sql_mode 系统变量,可以在 [mysqld] 选项组中使用 sql_mode = value 或 sql-mode = value ; -
在选项文件中,用于分割选项名和选项值的 = 两边是允许存在空格的,这在命令行中是不允许的; -
如果选项值包含空格或其他特殊字符,则可以考虑使用单引号或双引号,例如上面 pager 选项的值; -
通常使用选项文件都是用于指定用来进行数据库连接时需要使用的参数(如:主机名,用户名以及密码)。实际上,该文件还可指定用于其他目的的选项。例如,上述的案例中,在 [mysql] 选项组中,就指定了在交互模式下展示输出时应该使用的翻页程序; -
如果一个选项在选项文件中出现多次,那么以最后一次出现的为准; -
使用 # 或者 ; 开头信息都是备注。
如果想要确定 mysql 程序会从选项文件中读出哪些选项,可以使用下列命令:
mysql --print-defaults
同样,你还可以使用 my_print_default 实用程序,该程序接受选项组的名称作为参数,仅读取指定选项组中的选项。例如,一般情况下 mysqldump 会查找 [client] 和 [mysqldump] 两个选项组,因此可以这样使用该实用程序:
my_print_defaults client mysqldump
3.2 混用命令行和选项文件指定参数
实际上,你可以既使用命令行又使用选项文件来指定参数。例如,你可能只希望将用户名和主机名在选项文件中指定,但希望在命令行中输入密码,就可以采用这样的方式。当命令行和选项文件中出现同一个选项时,命令行参数的选项总是优先级更高。
3.3 为选项文件设置权限
在 Unix 等支持多用户的操作系统中,需要特别注意不能让别的用户通过读取选项文件来知道你连接数据库的账户和密码等信息。对此,可以使用下列命令对选项文件进行权限设置:
chmod 600 .my.cnf
chmod go-rwx .my.cnf
|