mysql相关笔记
接下来的过程,共分为三部分:源码安装 mysql server,配置远程连接权限和c++远程访问mysql测试。
一、源码安装mysql。
1、安装必备包。
yum install -y gcc gcc-c++ make automake wget
2、源码安装cmake。
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz tar -zxvf cmake-2.8.10.2.tar.gz cd cmake-2.8.10.2 ./bootstrap gmake gmake install cat install_manifest.txt //see install list
注意:如果执行./bootstrap 报错,则rm -rf CMakeCache.txt,再执行。
3、安装mysql
yum -y install bison-devel ncurses-devel wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.24.tar.gz tar -zxvf mysql-5.6.24.tar.gz cd mysql-5.6.24 cmake \-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DMYSQL_DATADIR=/usr/local/mysql/data \-DSYSCONFDIR=/etc \-DWITH_MYISAM_STORAGE_ENGINE=1 \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_MEMORY_STORAGE_ENGINE=1 \-DWITH_READLINE=1 \-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \-DMYSQL_TCP_PORT=3306 \-DENABLED_LOCAL_INFILE=1 \-DWITH_PARTITION_STORAGE_ENGINE=1 \-DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci make make install
注意:如果cmake出错,则:rm -rf CMakeCache.txt,再执行。
至此mysql已经安装完毕,接下来就是配置一些东西。
二、供远程连接。
1、groupadd mysql
2、useradd -g mysql mysql
3、chown -R mysql:mysql /usr/local/mysql
4、cd /usr/local/mysql
创建mysql自带的系统数据库:./scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
5、修改mysql配置文件,/usr/local/mysql/my.cnf添加以下内容:
basedir =/usr/local/mysql/
port=3306
datadir=/usr/local/mysql/data
6、添加PATH路径
把export PATH=$PATH:/usr/local/mysql/bin添加到/etc/profile中
7、source /etc/profile
8、需要更改该配置文件的所有者:chown -R mysql:mysql /usr/local/mysql/my.cnf否则下面启动 mysql服务会报错;
( 注:在启动MySQL服务时,会按照一定次序搜索my.cnf,先在/etc目录下找,找不到则会到你安装的mysql目录找,在本例中就是 /usr/local/mysql/my.cnf。
注意:在CentOS 6.4版操作系统的最小安装完成后,在/etc目录下会可能会存在一个my.cnf,需要将此文件更名为其他的名字,
如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。 重命名的命令是:mv my.cnf my.cnf.bak)
重命名 /etc下的my.cnf 为 my.cnf.bak mv my.cnf my.cnf.bak
9、cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #复制脚本
10、chmod +x /etc/init.d/mysqld #增加可执行权限
11、chkconfig --add mysqld #增加至sysV服务
12、chkconfig mysqld on #开机自启动
13、service mysqld start #启动mysql服务
14、netstat -aux|grep mysq #查看启动的mysql进程
15、systemctl stop firewalld.service#停止
(chmod 755 /usr/local/mysql/bin)
16、mysql -u root
17、update user set password=password('123456') where user='root';
18、允许远程连接数据库 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
19、生效 FLUSH PRIVILEGES;
20、exit;
21、vim /etc/sysconfig/iptables 写入 "-A INPUT -p tcp -m state --state NEW -m tcp
--dport 3306 -j ACCEPT"
三、c++远程操作数据库
1、寻找mysql客户端的共享库:libmysqlclient.so ,和mysql.h 等头文件。我是直接copy mysql server 服务器上的mysql/lib 和 mysql/include 下的东西。
2、测试:
MyDB.h
#include<iostream>
#include<string>
#include<mysql.h>
using namespace std;
class MyDB
{
public:
MyDB();
~MyDB();
bool initDB(string host,string user,string pwd,string db_name); //连接mysql
bool exeSQL(string sql); //执行sql语句
private:
MYSQL *mysql; //连接mysql句柄指针
MYSQL_RES *result; //指向查询结果指针
MYSQL_ROW row; //按行返回的查询
};
MyDB.cpp
#include<iostream>
#include<string>
#include "MyDB.h"
using namespace std;
MyDB::MyDB()
{
mysql=mysql_init(NULL); //初始化数据库连接变量
if(mysql==NULL)
{
cout<<"Error:"<<mysql_error(mysql);
//exit(1);
}
}
MyDB::~MyDB()
{
if(mysql!=NULL) //关闭数据连接
{
mysql_close(mysql);
}
}
bool MyDB::initDB(string host,string user,string passwd,string db_name)
{
// 函数mysql_real_connect建立一个数据库连接
// 成功返回MYSQL*连接句柄,失败返回NULL
mysql = mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 0, NULL, 0);
if(mysql == NULL)
{
cout << "Error: " << mysql_error(mysql);
//exit(1);
}
return true;
}
bool MyDB::exeSQL(string sql)
{
//mysql_query()执行成功返回0,执行失败返回非0值。
if (mysql_query(mysql,sql.c_str()))
{
cout<<"Query Error: "<<mysql_error(mysql);
return false;
}
else // 查询成功
{
result = mysql_store_result(mysql); //获取结果集
if (result) // 返回了结果集
{
int num_fields = mysql_num_fields(result); //获取结果集中总共的字段数,即列数
int num_rows=mysql_num_rows(result); //获取结果集中总共的行数
for(int i=0;i<num_rows;i++) //输出每一行
{
//获取下一行数据
row=mysql_fetch_row(result);
if(row<0) break;
for(int j=0;j<num_fields;j++) //输出每一字段
{
cout<<row[j]<<"\t\t";
}
cout<<endl;
}
}
else // result==NULL
{
if(mysql_field_count(mysql) == 0) //代表执行的是update,insert,delete类的非查询语句
{
// (it was not a SELECT)
int num_rows = mysql_affected_rows(mysql); //返回update,insert,delete影响的行数
}
else // error
{
cout<<"Get result error: "<<mysql_error(mysql);
return false;
}
}
}
return true;
}
text.cpp
#include<iostream>
#include"MyDB.h"
using namespace std;
int main()
{
MyDB db;
//连接数据库
db.initDB("192.168.1.121","root","000000","prize");
//将所有用户信息读出,并输出。
db.exeSQL("select * from prize;");
return 0;
}
Makefile
test:test.cpp MyDB.cpp
g++ test.cpp MyDB.cpp -o test -L/usr/local/mysql/lib -lmysqlclient -I/usr/local/mysql/include
make
./test 回查出prize 数据库下的 prize表的所有信息
.

浙公网安备 33010602011771号