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表的所有信息 

 

  

posted @ 2019-01-18 14:26  一梦、  阅读(157)  评论(0编辑  收藏  举报