由于系统空间原因,师兄建议我将原有服务器中的数据表存放在另外一台服务器上,于是一晚上基本上就忙着在对一台新服务器进行环境的配置。在这个过程中主要遇到下面的几个问题,下面将其总结一下,以便今后工作中可能会遇到。
问题一:远程连接设置
由于要在一台服务器上访问另外一台服务器中的MySQl数据库,所以要对它进行远程可访问设置。这个很简单,结合网上的操作,整理如下:
开启 MySQL 的远程登陆帐号有两大步:
1、确定服务器上的防火墙没有阻止 3306 端口。
MySQL 默认的端口是 3306 ,需要确定防火墙没有阻止 3306 端口,否则远程是无法通过 3306 端口连接到 MySQL 的。
如果您在安装 MySQL 时指定了其他端口,请在防火墙中开启您指定的 MySQL 使用的端口号。
如果不知道怎样设置您的服务器上的防火墙,请向您的服务器管理员咨询。
2、增加允许远程连接 MySQL 用户并授权。
1)首先以 root 帐户登陆 MySQL
在 Windows 主机中点击开始菜单,运行,输入“cmd”,进入控制台,MySQL 的 bin 目录下,然后输入下面的命令。
在 Linux 主机中在命令提示行下输入下面的命令。
- CODE: [COPY]
- > MySQL -uroot -p123456
123456 为 root 用户的密码。
2)创建远程登陆用户并授权
- CODE: [COPY]
- > grant all PRIVILEGES on discuz.* to ted@'123.123.123.123' identified by '123456';
上面的语句表示将 discuz 数据库的所有权限授权给 ted 这个用户,允许 ted 用户在 123.123.123.123 这个 IP 进行远程登陆,并设置 ted 用户的密码为 123456 。
下面逐一分析所有的参数:
all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限,例如:select,insert,update,delete,create,drop 等,具体权限间用“,”半角逗号分隔。
discuz.* 表示上面的权限是针对于哪个表的,discuz 指的是数据库,后面的 * 表示对于所有的表,由此可以推理出:对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授 权为“数据库名.表名”。
ted 表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。
123.123.123.123 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。
123456 为用户的密码。
执行了上面的语句后,再执行下面的语句,方可立即生效。
-----------------------------------------------------------------------------------------------------------------
解决方法:
1、改表法:
可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从“localhost”改称“%”
x:\>mysql -u root -pvmware mysql> use mysql; mysql> flush privileges; |
注:mysql> flush privileges; 使修改生效。
2、授权法:
例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; |
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword’ WITH GRANT OPTION; |
该段转载自:http://blog.chinaunix.net/uid-23215128-id-2951624.html
问题二:对MySQL数据库的字符编码设置问题
通过另外一台服务器上的程序将文本文件中的黑名单上传到另外一台服务器的数据表中,由于黑名单中涉及到“地址”字段这种包含中文的字符,所以在上传完之后,发现在数据库端不能正常显示中文,首先想到的是字符编码的问题,照着网上的教程,改了一下编码。发现,还是不对。这时候想到之前写PHP代码的时候,有设计中文编码在网络传输中的转换问题,但是查了之前的PHP源码,发现与这边的问题不同。后来还是坚信是数据库字符编码存在问题。照着网上的方法改了很多次,可能现在显示正确,但是一重启服务器,字符编码又回复原样,主要还是Latin编码。反反复复好几次,最后找到一个帖子,发现要在关闭MySQL的情况下,对配置文件进行更改,然后重新启动MySQL服务,最终可以正常显示。结合该方法,整理如下:
MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8。
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
/etc/init.d/mysql start (stop) 为启动和停止服务器
找到客户端配置[client] 在下面添加
default-character-set=utf8 #默认字符集为utf8
在找到[mysqld] 添加
default-character-set=utf8 #默认字符集为utf8
init_connect='SET NAMES utf8' #(设定连接mysql数据库时使用utf8编码,以让mysql数据库为utf8运行)
修改好后,重新启动mysql 即可,重新查询数据库编码可发现编码方式的改变:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
此方法用于标准 mysql版本同样有效,对于/etc/my.cnf文件,需要从mysql/support-files的文件夹cp my-large.cnf一份到/etc/my.cnf