异想天开

What's the true meaning of light, Could you tell me why

mysql数据库编译安装

日期:2013-10-18 14:19:43
  
最后更新日期:2015-05-11 19:08:02
1.mysql安装
2.程序连接mysqld问题
一.mysql编译安装
1.去官网下载mysql源码,下载之前考虑好版本,放在你指定目录下,假设该目录为$MYSQL
2../configure --prefix=/usr/local/mysql
我一般倾向于将自己编译安装的程序,放在/usr/local下单独一个目录,这样编译另外一个版本就制定另外的目录即可。删除时,也很方便。
3. make all ; make install
编译安装后,/usr/local/mysql目录会有诸如{bin/ lib/ include/}目录树。
编译安装后需要做的事:
4. cp  mysql-5.1.71/support-files/my-medium.cnf /etc/my.cnf
或者自己写这个配置文件,简单配置文件如下:
[code lang="cpp"]
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
注: 若启动不了mysqld可以查看日志文件,帮助分析原因,可以在/etc/my.cnf自己定义日志文件存放路径。
[/code]
一些mysql数据库调优方面的也是设置这个/etc/my.cnf文件。
5.添加用户mysql
useradd mysql
6. cd $MYSQL ; ./scripts/mysql_install_db  --user=mysql --datadir=/var/lib/mysql
mysql程序安装后,需要建立系统数据库,该脚本即可自动完成这样的事,如果你乐意也可以手动去做。
7.添加作为服务自动启动
 cp /usr/local/mysql/share/mysql/mysql.server  /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
8.设置环境变量
export PATH=$PATH:/usr/local/mysql/bin
在/etc/man.config文件相应地方添加:
MANPATH /usr/local/mysql/share/man
这样就可以通过man查看mysql相关的帮助文档了。
8.启动mysqld
添加服务后 service mysqld start
或者/usr/local/mysql/share/mysql/mysql.server start
二.mysql使用中遇到的问题
1.程序连接本地数据库问题
mysql版本 5.1.69
程序出错信息:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
程序连接数据库代码:
[code lang="cpp"]
string m_host("localhost"),m_user("root"),m_passwd("xxx"),m_dbname("xxx");
MYSQL m_sql ;
mysql_init(&m_sql);
if(NULL == mysql_real_connect(&m_sql, m_host.c_str(), m_user.c_str(),
m_passwd.c_str(), m_dbname.c_str(),m_port,NULL,CLIENT_MULTI_QUERIES))
{
LOG4CPLUS_DEBUG(_logger,"mysql connect err"<<mysql_error(&m_sql));
}
[/code]
mysql启动信息:


[code lang="cpp"]
[root@localhost check_sql]# ps -ef | grep mysqld
root      2817     1  0 11:22 pts/2    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/localhost.localdomain.pid
mysql     2915  2817  0 11:22 pts/2    00:00:00 /usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/lib/mysql/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock
root      2996  2634  0 12:07 pts/2    00:00:00 grep mysqld
[/code]
原因分析:
1.使用mysql -uroot -hlocalhost -p手动连接,可以连接。
2.查看mysql_real_connect文档,发现两个有用信息(不想看,可以忽略,直接看解决方案):
[code lang="cpp"]
If unix_socket is not NULL, the string specifies the socket or named pipe to use. Note that the host parameter determines the type of the connection.The value of host may be either a host name or an IP address.
If host is NULL or the string "localhost", a connection to the local host is assumed. For Windows,
the client connects using a shared-memory connection, if the server has shared-memory connections enabled.
Otherwise, TCP/IP is used. For Unix, the client connects using a Unix socket file. For local connections,
you can also influence the type of connection to use with theMYSQL_OPT_PROTOCOL or MYSQL_OPT_NAMED_PIPE options to mysql_options(). The type of connection must be supported by the server. For a host value of "." on Windows,
the client connects using a named pipe, if the server has named-pipe connections enabled. If named-pipe connections are not enabled, an error occurs.
For some parameters, it is possible to have the value taken from an option file rather than from an explicit value in the mysql_real_connect() call. To do this, call mysql_options() with the MYSQL_READ_DEFAULT_FILE or MYSQL_READ_DEFAULT_GROUP option before calling mysql_real_connect(). Then, in themysql_real_connect() call, specify the “no-value” value for each parameter to be read from an option file:
[/code]
从上面,我们可以得知,mysql_real_connect连接时,host为localhost时,默认使用Unix域套接字,编程发现unix域套接字默认值为/tmp/mysql.sock。
解决方法:
1.程序使用ip连接。
2.更改程序代码,不管是不是localhost,设置默认为tcp连接,即增加如下代码(MYSQL_PROTOCOL_TCP这个值查看mysql.h获得):
 uint32_t  protype=MYSQL_PROTOCOL_TCP;
mysql_options(&m_sql,MYSQL_OPT_PROTOCOL,&protype);
为什么mysql自带的客户端可以连接?
猜想其编写方式是:
1.设置默认连接方式为tcp连接。
2.读取配置文件mysqld组。
大概代码如下:
[code lang="cpp"]
mysql_options(&m_sql,MYSQL_READ_DEFAULT_FILE,"/etc/my.cnf");
mysql_options(&m_sql,MYSQL_READ_DEFAULT_GROUP,"mysqld");
uint32_t  protype=MYSQL_PROTOCOL_TCP;
mysql_options(&m_sql,MYSQL_OPT_PROTOCOL,&protype);
[/code]
综上,这次产生问题的原因在于我直接数据库连接池连接数据库,而我们的库init函数没有设置上诉操作,导致连接失败。现在感觉解决问题,就像在玩密室逃脱一样,一步步猜测,验证猜测,不亦乐乎。
PS:提示 Can't connect to local MySQL server through socket '/tmp/mysql.sock'
1.提示找不到,那么你的mysql.sock就不在/tmp目录。使用自带的客户端mysq.mysql -uroot -hlocalhost -p不能连接
使用mysql -uroot -h127.0.0.1 -p 可以连接
为什么会发生这种情况?与上面的情况相悖,其实可能是mysql客户端实现不一样,这里反正是个黑盒子。另外的解决办法:
1.建一条软连接
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
2.不过软连接,还是可能被清除掉,最好的办法是/etc/my.cnf指定配置
[client]
socket=/var/lib/mysql/mysql.sock
重启即可。
3.如果是只是mysql客户端连数据库,那么可以这样
mysql -socket=/var/lib/mysql/mysql.sock

2.乱码问题
养成良好的习惯,将数据库和表的建表语句的字符集显示设定为utf8,插入和删除时,都先使用set names=utf8,然后操作mysql。另外有个问题需要注意,比如习惯mysql -uroot -hlocalhost -p这样连接数据库服务器后,若数据库字符集为utf8,也需要手工指定set names=utf8,这样就没有问题了,否则你插入的数据,是你当前的show variables like "%char%"里面的字符集。