mysql安装与操作
康 林
1 安装
1.1 下载源码:
现在版本是:
MySQL Community Server 5.5.21
http://mysql.com/downloads/
1.2 解压:
tar -xzvf mysql-5.5.21.tar.gz
1.3 编译:
需要cmake工具,cmake是一个跨平台编译工具,它能生成相应平台下的编译时所需要的工程文件。你可以在http://www.cmake.org/cmake/resources/software.html下载。
编译前,建议查看源码根目录下的INSTALL-SOURCE
进入mysql源码根目录,执行下面命令:
# cmake . –LAH #查看配置变量
#cmake . #生成编译配置文件(用-Dcmake . -DCMAKE_INSTALL_PREFIX:PATH=/usr/mysql)
#make #编译
#make install #安装
1.4 安装后程序结构:
1.4.1 安装位置:
// install prefix
CMAKE_INSTALL_PREFIX:PATH=/usr/local/mysql
1.4.2 数据库文件位置:
// default MySQL data directory
MYSQL_DATADIR:PATH=/usr/local/mysql/data
1.4.3 引擎配置:
默认配置:
WITH_ARCHIVE_STORAGE_ENGINE:BOOL=OFF
WITH_BLACKHOLE_STORAGE_ENGINE:BOOL=OFF
WITH_FEDERATED_STORAGE_ENGINE:BOOL=OFF
WITH_INNOBASE_STORAGE_ENGINE:BOOL=ON
WITH_PARTITION_STORAGE_ENGINE:BOOL=ON
WITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON
1.5 Mysql命令
1.6 安装后授权表配置
在Unix中,由mysql_install_db设置授权表。在某些安装中,该程序自动运行:
· 如果你使用RPM分发版在Linux上安装MySQL,服务器RPM运行mysql_install_db。
· 如果你使用PKG分发版在Mac OS X上安装MySQL,安装器运行mysql_install_db。
否则,你需要自己运行mysql_install_db。在这个版本中,在源码根目录下的子目录support-files下提供了一个包装脚本binary-configure
在安装目录下的 :
linux-pvff99:/usr/local/mysql # scripts/mysql_install_db --user=mysql
1.7 启动mysql服务
linux-pvff99:/usr/local/mysql # bin/mysqld_safe --user=mysql &
1.8 验证服务是否运行
运行下面任一个命令验证服务是否正常
linux-pvff99:/usr/local/mysql # bin/mysqladmin version
linux-pvff99:/usr/local/mysql # bin/mysqladmin variables #查看系统全局变量
linux-pvff99:/usr/local/mysql #bin/mysqlshow
1.9 验证关闭服务
linux-pvff99:/usr/local/mysql #bin/mysqladmin -u root shutdown
1.10 在系统启动时mysql自动启动
把 support-files/mysql.server
在mysql.server启动服务器之前,它把目录改变到MySQL安装目录,然后调用safe_mysqld。如果你想要作为一些特定的用户运行服务器,在/etc/my.cnf选项文件的[mysqld]组增加相应user选项,如本节后面所示。(如果你有在一个非标准的地点安装的二进制分发版,你可能需要编辑mysql.server。修改它,运行safe_mysqld前,cd到正确的目录。注意如果你修改mysql.server,那么某个时候升级MySQL时,你的修改版本将被覆盖,因此你应该做一个你可重新安装的编辑过的版本的拷贝)。
mysql.server stop通过向服务器发出一个信号停止它。你可手动执行mysqladmin shutdown关闭服务器。
要想在服务器上自动启动和停止MySQL,应在“/etc/rc *文件中适当的地方增加启动、停止命令。
要想手动安装mysql.server,用名称mysql将它复制到/etc/init.d目录,然后将它变为可执行文件。只需要将位置更改为mysql.serveris所在并执行这些命令的相应目录:
shell> cp mysql.server /etc/init.d/mysql
shell> chmod +x /etc/init.d/mysql
旧的Red Hat系统使用/etc/rc.d/init.d目录,不使用/etc/init.d。相应地调节前面的命令。也可以首先创建指向/etc/rc.d/init.d的符号连接/etc/init.d:
shell> cd /etc
shell> ln -s rc.d/init.d .
安装脚本后,用来激活它以便在系统启动时运行所需要的命令取决于你的操作系统。在Linux中,你可以使用chkconfig:
shell> chkconfig --addMySQL
在一些Linux系统中,还需要下面的命令来完全激活MySQL脚本:
shell> chkconfig --level 345MySQL on
1.11 授权
1.11.1 查看授权表
bin/mysql -u root
mysql> SELECT User, Host, Password FROM mysql.user;
+------+--------------+----------+
| User | Host | Password |
+------+--------------+----------+
| root | localhost | |
| root | linux-pvff99 | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | linux-pvff99 | |
+------+--------------+----------+
6 rows in set (0.00 sec)
Mysql的授权信息被保存在mysql.user中。
字段说明:
User:用户名
Host:授权的主机(‘%’表示从外面任一IP访问被授权)
Password:密码
1.11.2 向MySQL增加新用户账户
可以用两种方式创建MySQL账户,最好的方法是使用GRANT语句,因为这样更精确,错误少。
1.11.2.1· 使用GRANT语句
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...]
object_type =
TABLE
| FUNCTION
| PROCEDURE
with_option =
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
GRANT和REVOKE语句允许系统管理员创建MySQL用户账户,授予权限和撤销权限。
示例:
以root连接到服务器上后,可以添加新账户。下面的语句使用GRANT来设置四个新账户:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';
用GRANT语句创建的账户有下面的属性:
· 其中两个账户有相同的用户名monty和密码some_pass。两个账户均为超级用户账户,具有完全的权限可以做任何事情。一个账户 ('monty'@'localhost')只用于从本机连接时。另一个账户('monty'@'%')可用于从其它主机连接。请注意monty的两个账户必须能从任何主机以monty连接。没有localhost账户,当monty从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。结果是,monty将被视为匿名用户。原因是匿名用户账户的Host列值比'monty'@'%'账户更具体,这样在user表排序顺序中排在前面。(user表排序的讨论参见5.7.5节,“访问控制,阶段1:连接核实”)。
· 一个账户有用户名admin,没有密码。该账户只用于从本机连接。授予了RELOAD和PROCESS管理权限。这些权限允许admin用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-xxx命令,以及mysqladmin processlist。未授予访问数据库的权限。你可以通过GRANT语句添加此类权限。
· 一个账户有用户名dummy,没有密码。该账户只用于从本机连接。未授予权限。通过GRANT语句中的USAGE权限,你可以创建账户而不授予任何权限。它可以将所有全局权限设为'N'。假定你将在以后将具体权限授予该账户。
新加一个有从其它主机连接的root账记:
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘root’@'%'
-> IDENTIFIED BY 'root' WITH GRANT OPTION;
1.11.2.2· 直接操作MySQL授权表
1.11.3 设置账户密码
有三种设置账户密码的方法:
1.11.3.1在mysql客户端用 set password声明
格式:SET PASSWORD ‘授权用户名’@’授权主机IP’ = PASSWORD(‘授权密码’)
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
Query OK, 0 rows affected (0.00 sec)
1.11.3.2在mysql客户端用update声明
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
-> WHERE User = 'root';
mysql> FLUSH PRIVILEGES; #更新授权表到应用
1.11.3.3在命令行用mysqladmin客户端程序
shell> mysqladmin -u root password "newpwd"
shell> mysqladmin -u root -h host_name password "newpwd"
1.11.4 更改账户密码:
bin/mysqladmin -u root -pnewpwd password root
注意:-p 后面没有空格,紧跟老密码
2 配置
2.1 配置文件
示例配置文件位于源码根目录/support-files目录下。
一个典型的“/etc/my.cnf”文件可能看起来像这样:
[mysqld] #mysql实例段
port=3306 #mysql监听端口
datadir=/usr/local/mysql/var #数据库文件目录
socket=/var/tmp/mysql.sock #soket位置
pid-file = /usr/local/mysql/data2/hostname.pid2 #进程ID保存的位置
user=mysql #本实例用户名
password = #密码
[mysql.server]
basedir=/usr/local/mysql
mysql.server脚本使用下列变量:basedir、datadir和pid-file。定义后,必须将它们放到选项文件中,不能放到命令行。mysql.server只识别start和stop命令行参数。
下面的表显示了服务器和每个启动脚本从选项文件读取哪个选项组:
脚本 |
选项组 |
mysqld |
[mysqld], [server], [mysqld-major-version] |
mysql.server |
[mysqld], [mysql.server], [server] |
mysqld_safe |
[mysqld], [server], [mysqld_safe] |
[mysqld-major-version]意味着名为[mysqld-5.0]的组,[mysqld-5.1]用于版本为5.0.x、5.1.x等的服务器。该特性可以用来指定只被给定发布系列的服务器读取的选项。
为了向后兼容,mysql.server还读取[mysql_server]组,mysqld_safe还读取[safe_mysqld]组。然而,当使用MySQL 5.1时,你应当更新选项文件,使用[mysql.server]和[mysqld_safe]组。
如果要查看数据库使用的字符集,可以输入show variables like 'character%';(注意分号不可省略)
2.2 同一台机器上运行多个mysql实例
mysqld_multi:管理多个MySQL服务器的程序
mysqld_multi可以管理多个帧听不同Unix套接字文件和TCP/IP端口的连接的mysqld进程。它可以启动或停止服务器,或报告它们的当前状态。
程序寻找my.cnf(或在--config-file自定义的配置文件)中的[mysqldN]组(或--config-file选项指定的文件)。N可以为任何正整数。在下面的讨论中该数字指选项组号,或GNR。组号区别各选项组,并用作mysqld_multi的参数来指定想要启动、停止哪个服务器或获取哪个服务器的状态报告。这些组中的选项与将用来启动mysqld的[mysqld]组中的相同。但是,当使用多个服务器时,需要每个服务器使用自己的选项值,例如Unix套接字文件和TCP/IP端口号。关于在多服务器环境中,每个服务器对应唯一选项的详细信息。
要想调用mysqld_multi,使用下面的语法:
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]
start、stop和report表示你想要执行的操作。你可以在单个服务器或多个服务器上执行指定的操作,取决于选项名后面的GNR列。如果没有该列,mysqld_multi为选项文件中的所有服务器执行该操作。
每个GNR值代表一个选项组号或组号范围。GNR值应为选项文件中组名末尾的号。例如,组[mysqld17]的GNR为17。要想指定组号的范围,用破折号间隔开第1个和最后1个号。GNR值10-13代表组[mysqld10]到[mysqld13]。可以在命令行中指定多个组或组范围,用逗号间隔开。GNR列不能有空格字符(空格或tab);空格字符后面的内容将被忽略掉。
该命令使用选项组[mysqld17]启动单个服务器:
shell> mysqld_multi start 17
该命令停止多个服务器,使用选项组[mysql8]和[mysqld10]至[mysqld13]:
shell> mysqld_multi stop 8,10-13
使用该命令列出设置选项文件的示例:
shell> mysqld_multi --example
mysqld_multi支持下面的选项:
· --config-file=name
指定选项文件名。这关系到mysqld_multi从哪里寻找[mysqldN]选项组。没有该选项,从通用my.cnf文件读所有选项。选项不影响mysqld_multi从哪里读取自己的选项,总是从通用my.cnf文件的[mysqld_multi]组读取。
· --example
显示示例选项文件。
· --help
显示帮助消息并退出。
· --log=name
指定日志文件名。如果该文件存在,后面为日志输出。
· --mysqladmin=prog_name
用来停止服务器的mysqladmin二进制。
· --mysqld=prog_name
可用的mysqld二进制。请注意你还可以将该选项的值指定为mysqld_safe。选项被传递给mysqld。确保在PATH环境变量设定值或mysqld_safe中有mysqld所在目录。
· --no-log
按照标准输出打印日志信息,不要写入日志文件。默认情况下,输出写入日志文件。
· --password=password
调用mysqladmin时使用的MySQL账户的密码。请注意该密码值不是可选项,不象其它MySQL程序。
· --silent
禁用警告。
· --tcp-ip
通过TCP/IP端口而不是Unix套接字文件来连接每个MySQL服务器。(如果找不到套接字文件,服务器仍然可以运行,但只能通过 TCP/IP端口访问)。默认情况下,使用Unix套接字文件进行连接。该选项影响stop和report操作。
· --user=user_name
调用mysqladmin时使用的MySQL账户的用户名。
· --verbose
更详细。
· --version
显示版本信息并退出。
关于mysqld_multi的一些注解:
· 确保停止mysqld服务器(用mysqladmin程序)的MySQL账户在各个服务器中的用户名和密码相同。并且应确保账户具有SHUTDOWN权限。如果你想要管理的服务器的管理账户有许多不同的用户名或密码,你需要在每个服务器上创建一个账户,并具有相同的用户名和密码。例如,你可以执行下面的命令为每个服务器设置一个普通multi_admin账户:
· shell> mysql -u root -S /tmp/mysql.sock -proot_password
· mysql> GRANT SHUTDOWN ON *.*
· -> TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
你必须为每个mysqld服务器执行该操作。当连接时适当更改连接参数。请注意账户名的主机部分必须允许你用multi_admin从你想要运行mysqld_multi的主机进行连接。
· 如果你使用mysqld_safe来启动mysqld(例如,--mysqld=mysqld_safe),--pid-file选项很重要。每个mysqld应有自己的进程ID文件。使用mysqld_safe而不使用mysqld的好处是mysqld_safe“守护”其mysqld进程,如果用kill –9发送的信号或由于其它原因(例如分段故障)进程终止,则重启进程。请注意mysqld_safe脚本需要你从某个位置启动它。这说明运行mysqld_multi前你必须进入某个目录。如果启动时有问题,请参见mysqld_safe脚本。特别是要检查下列行:
· ----------------------------------------------------------------
· MY_PWD=`pwd`
· # Check if we are starting this relative (for the binary release)
· if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
· -x ./bin/mysqld
· ----------------------------------------------------------------
上述行执行的测试应成功,否则你可能遇到了问题。
· 每个mysqld的Unix套接字文件和TCP/IP端口号必须不同。
· 你可能想要为mysqld使用--user选项,但为此你需要用Unix root用户运行mysqld_multi脚本。选项文件中有选项不要紧;如果你不是超级用户,并且你用自己的Unix账户重启mysqld进程,你只会得到警告。
· 重要:确保mysqld进程启动所用Unix账户可以完全访问数据目录。不要使用Unix root账户,除非你知道你在做什么。
· 非常重要:使用mysqld_multi前,确保理解传递给mysqld服务器的选项的含义以及你为什么想要独立的mysqld进程。应清楚在相同的数据目录下使用多个mysqld服务器的危险。使用单独的数据目录,除非你知道你在做什么。在线程系统中,在相同的数据目录下启动多个服务器不会得到超性能。
下面的示例显示了你如何设置选项文件来使用mysqld_multi。专门省去第1个和第5个[mysqldN]组来说明你的选项文件可以稍有不同。这样给你更大的灵活性。mysqld程序重启或停止的顺序由它们在选项文件中的顺序决定。
# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = john
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
user = tonu
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = jani