好久之前的学习笔记,分享出来,希望能帮助到更多初学者
备注:本笔记以mysql-5.1.73版本为例进行说明
1. mysql源码编译/安装步骤
1) 官网下载mysql源码并解压
2) cd至源码目录,执行
./configure --prefix=/home/slvher/tools/mysql-5.1.73 --with-charset=gbk --with-charset=gb2312 --with-extra-charsets=all --with-plugins=max-no-ndb
备注:--prefix指定安装目录,需根据实际情况修改
--with-charset指定默认支持的字符集,可指定多个(若需要数据库支持简体中文,请务必指定gbk和gb2312,至少要指定1个)
--with-plugins指定安装innodb引擎(从mysql5.1版本开始需要手动指定,之前则是默认安装的)
3) 查看Makefile文件,确认几个基本配置无误后,执行
shell> make
shell> make install
备注1:若
install失败是由第2步执行./configure时参数指定错误所致,则需重新执行./configure
且务必执行make clean后
,再重新make && make install。若不先make clean直接make,则源码目录下上次编译完的部分文件不会重新编译,而这些上次编译的文件使用的还是上次的错误配置参数!备注2: 安装完成后,cd至mysql安装目录(通过--prefix指定的路径或默认的系统路径),可以看到bin/include/lib之类的文件夹,这表明二进制文件安装成功
4) 从源码目录的support-files文件夹拷贝my-medium.cnf(共有small/medium/large三个level,根据机器配置选择合适的)配置至~/.my.cnf文件,并配置相关参数。mysql server启动时会读取该文件的配置,关于mysql对my.cnf文件的搜索路径,可以查看官方的mysql-refman文档。
备注: my.cnf配置不当可能会引起mysql报错,例如"mysql: unknown variable 'character-set-server=utf8'",该问题解决方法参见 这里
5) 在mysql安装目录先后执行如下命令以便安装权限表及默认数据库
./bin/mysql_install_db --basedir=/home/slvher/tools/mysql-5.1.73 --datadir=/home/slvher/tools/mysql-5.1.73/db-data
./bin/mysql_install_db --user=slvher
6) 在mysql安装目录执行如下命令启动mysqld: ./bin/mysqld_safe &
7) 执行ps -x查看mysqld是否启动成功,其中d表示守护模式。因此,正常的关闭mysqlserver的方法应该是下面的命令:
./bin/mysqladmin shutdown -uroot -p
然后输入root密码即可停掉mysqld进程,若强行kill -9杀进程可能会导致数据库损坏!8) 将mysql执行路径加入PATH变量的搜索路径
至此,支持中文gbk和gb2312的mysql server安装完成。可执行以下命令验证其支持的字符集:
shell> mysql -uroot
mysql> show character set;
备注1:
新安装的mysql server,root默认密码为空备注2: 若在第2步执行./configurer时通过--with-charset参数指定了gbk或gb2312,则show的输出应该能看到这些字符集,否则,就准备重新安装一遍吧 -_-
2. 安装完成并启动mysqld_safe后的访问权限配置
1) 设定mysql server的root密码
root密码默认为空(因此,运行mysql -uroot可直接登录;此外,登录后运行"select User, Host, Password from mysql.user"可以看到root的Password那个字段为空),所以需要设定root密码,方法有几种:
a. 使用set password语句:
shell> mysql -u root
mysql> set password for 'root'@'localhost' = PASSWORD('xxx'); # 其中xxx为新密码
mysql> set password for 'root'@'host_name' = PASSWORD('xxx'); # 其中host_name为机器名
mysql> set password for 'root'@'127.0.0.1' = PASSWORD('xxx');
b. 使用update语句: shell> mysql -u root
mysql> update mysql.user set Password = PASSWORD('xxx') where User = 'root';
mysql> flush privileges; # 该语句会让mysql server重新读取权限表
若root对应的Host字段有多个,则推荐使用这种方法指定root密码,因为它明显更简洁。c. 使用mysqladmin工具:
shell> mysqladmin -u root password "xxx"
shell> mysqladmin -u root -h host_name passord "xxx"
这种方法无法设定形如'root'@'127.0.0.1'的root新密码,故个人觉得用处不大。注意:新安装的mysql server默认允许本机匿名用户登录,若不需要,最好删除匿名用户。
2) 添加新用户并授权
由于root权限过大,有必要为mysql添加normal user并设定其权限,可通过以下步骤实现(假设已登录了mysql server所在机器):
shell> mysql -u root -pxxx # 注意-p与password(假设为"xxx")间无空格,可省去输入密码的交互过程
mysql> create user work;
mysql> grant select on db1.test_table to 'user'@'localhost' identified by 'xxx';
上述grant语句执行效果:从localhost登录的user必须用xxx密码才能登录成功,且只能访问数据库db1的test_table表。若要为从localhost登录的user授权对所有库所有表的全部操作权限,则可执行如下命令:
mysql> grant all privileges on *.* to 'user'@'localhost' identified by 'xxx';
若为远程登录的用户授权(对db1.test_table的select/insert权限),则需执行下面的命令:
mysql> grant select, insert on db1.test_table to 'user'@'%' identified by 'xxx';
上述语句中的'%'表示任意主机,因此可以覆盖远程登录的情况。注意1: 有时对远程登录用户授权时会发现,即使执行了上述命令,用户依然无法远程登录。这种情况一般是由于该用户名首先命中了权限表的某条不支持远程登录的记录(如不允许来自某个IP地址的用户登录)。排查问题时,可执行select User, Host, Password from mysql.user where User = 'user'以查看user用户目前拥有的权限,定位其是否具有从任意机器登录的权限或是否某个记录明确指定了user用户不能从某台特定的机器登录。
注意2: 有时完成远程用户登录设置后会发现,远程登录正常,而本地通过-h localhost 或 -h 127.0.0.1登录时却无法成功,这一般是由于允许本机匿名用户无密码登录造成的(mysql server默认允许匿名登录),只需删除匿名用户的登录权限即可。
【参考资料】
1. mysql reference manual
2. mysql: unknown variable 'character-set-server=utf8'解决方法
========================= EOF ==========================