接下来的过程,共分为三部分:源码安装 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]<<" "; } 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表的所有信息