您的位置:首页 > 运维架构 > Linux

CentOS 7 下的MySQL安装以及C连接MySQL

2015-07-31 21:50 597 查看
这几天因为要用到Linux操作系统和MySQL,急忙装了个虚拟机,然后听朋友的推荐装了CentOS这款系统,并且还是最新版本的CentOS 7,由于本人是一个Linux小白,可以说是刚接触Linux,所以可以说是被这个系统坑的十分惨。

这下CentOS装好了,可以安装Mysql了,初学Linux,完全不会,只好去找资料看博客,最后决定用MySQL官方编译好的二进制文件安装,下载好了进入安装包所在目录,执行命令:tar
xvf MySQL-5.6.21-1.linux_glibc2.5.i386.rpm-bundle.tar

解压完成后有以下7个目录:
MySQL-shared-compat-5.6.21-1.linux_glibc2.5.i386.rpm

MySQL-test-5.6.21-1.linux_glibc2.5.i386.rpm

MySQL-embedded-5.6.21-1.linux_glibc2.5.i386.rpm

MySQL-shared-5.6.21-1.linux_glibc2.5.i386.rpm

MySQL-devel-5.6.21-1.linux_glibc2.5.i386.rpm

MySQL-client-5.6.21-1.linux_glibc2.5.i386.rpm

MySQL-server-5.6.21-1.linux_glibc2.5.i386.rpm

然后执行命令: rpm -ivh MySQL-server-5.6.21-1.linux_glibc2.5.i386.rpm
发现这样的错误信息:
错误:依赖检测失败:

libc.so.6 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.1) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.1.2) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.1.3) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.2) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.2.3) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.3) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.3.3) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.3.4) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libc.so.6(GLIBC_2.4) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libcrypt.so.1 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libcrypt.so.1(GLIBC_2.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libdl.so.2 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libdl.so.2(GLIBC_2.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libdl.so.2(GLIBC_2.1) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libgcc_s.so.1 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libgcc_s.so.1(GCC_3.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libgcc_s.so.1(GLIBC_2.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libm.so.6 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libm.so.6(GLIBC_2.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libm.so.6(GLIBC_2.1) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libpthread.so.0 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libpthread.so.0(GLIBC_2.0) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libpthread.so.0(GLIBC_2.1) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libpthread.so.0(GLIBC_2.2) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libpthread.so.0(GLIBC_2.3.2) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

librt.so.1 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

librt.so.1(GLIBC_2.2) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libstdc++.so.6 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libstdc++.so.6(CXXABI_1.3) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

libstdc++.so.6(GLIBCXX_3.4) 被 MySQL-server-5.6.21-1.linux_glibc2.5.i386 需要

MySQL-server < 5.6.26-2.el7 被 (已安裝) mysql-community-server-5.6.26-2.el7.x86_64 取代

可以看出是缺少库,那我没办法只好下载相应的库喽,最后按装还是失败了,提示有的库找不到,没办法此路不通我只好寻找其他的路了。
之后发现可以应yum来直接下载mysql-community-server,在这之中发现了CentOS 7的默认数据库已经不是MySQL了,被改成了MariaDB这个东西,起初并不知道这是什么东西,最后才了解到maridb是mysql的社区版,好像是为了开源,所以有了maridb,其实跟mysql是一样的。甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
我还把maridb卸载了来安装mysql,最后才发现这其实可以不卸载,直接安装会覆盖掉maridb。
执行命令yum install mysql-community-server
显示有三个包和7、8个依赖库,然后系统会自动寻找安装包,并进行安装。
安装完毕后启动数据库:service mysqld restart
打印语句Redirecting to /bin/systemctl restart mysqld.service,这就代表数据库启动成功。
因为是初次启动所以要设置密码。

# mysql -uroot

mysql> set password for ‘root’@‘localhost’ = password('mypasswd');

mysql> exit

本来这样就可以的,结果我在其中出了个错误导致密码无法修改,最后新建了好多个root账户和密码。因为觉得难看所以把mysql表中的root账户全删了,又重新创建了一个root账户,这下出问题了,这个root账户没有任何权限,连最基础的建表都不行,没有办法只好又去查资料,最后是这样解决的:

先关闭mysql:service mysqld stop

然后: mysqld_safe --skip-grant-tables(快速重置修改mysql的东西,不需要密码登录)

再开启mysql:service mysqld start

执行:mysql

use mysql

更新的MYSQL.USER表的所有字段中为N的为Y就可以了。

update user set Select_priv ='Y' where user = 'root';

update user set Insert_priv ='Y' where user = 'root';

update user set Update_priv ='Y' where user = 'root';

update user set Delete_priv ='Y' where user = 'root';

update user set Create_priv ='Y' where user = 'root';

update user set Drop_priv ='Y' where user = 'root';

update user set Reload_priv ='Y' where user = 'root';

update user set Shutdown_priv ='Y' where user = 'root';

update user set Process_priv ='Y' where user = 'root';

update user set File_priv ='Y' where user = 'root';

update user set Grant_priv ='Y' where user = 'root';

update user set References_priv ='Y' where user = 'root';

update user set Index_priv ='Y' where user = 'root';

update user set Alter_priv ='Y' where user = 'root';

update user set Show_db_priv ='Y' where user = 'root';

update user set Super_priv ='Y' where user = 'root';

update user set Create_tmp_table_priv ='Y' where user = 'root';

update user set Lock_tables_priv ='Y' where user = 'root';

update user set Execute_priv ='Y' where user = 'root';

update user set Repl_slave_priv ='Y' where user = 'root';

update user set Repl_client_priv ='Y' where user = 'root';

update user set Create_view_priv ='Y' where user = 'root';

update user set Show_view_priv ='Y' where user = 'root';

update user set Create_routine_priv ='Y' where user = 'root';

update user set Alter_routine_priv ='Y' where user = 'root';

update user set Create_user_priv ='Y' where user = 'root';

update user set Event_priv ='Y' where user = 'root';

update user set Trigger_priv ='Y' where user = 'root';

这上边的一堆东西基本上就是root超级用户的权限了。

设置完毕后root用户就拥有了很大的权限了

这下mysql也安装好了,权限问题也解决了,接下来就可以用程序来连接MySQL数据库了,

下面是我写的一个简单的用C++来连接MySQL数据库的小例子,只有连接功能。

#include<mysql.h>

#include<iostream>

using namespace std;

int main()

{

MYSQL mysql;

MYSQL_RES *res;

MYSQL_ROW row;

char *query;

int t,r;

mysql_init(&mysql);

if(!mysql_real_connect(&mysql,"localhost","root","456258","voice",0,NULL,0))

{

cout<<"error connecting!"<<endl;

}

cout<<"successful!"<<endl;

}

进行编译,g++ mysql.cpp -o mysql

结果出错了:mysql.cpp:1:18: 致命错误:mysql.h:没有那个文件或目录

#include<mysql.h>

^

编译中断。

显示没有mysql.h。这下出问题了,是因为没有安装mysql-devel

运行:yum install mysql-devel

安装完毕,再次编译。我擦,

mysql.cpp:1:18: 致命错误:mysql.h:没有那个文件或目录

#include<mysql.h>

^

编译中断。

还是这个问题。我明明已经安装了mysql-devel,怎么还会出问题了,没办法我自己找mysql.h这个文件子啊那个目录下吧,
find . -name "mysql*"
出现了好多结果,我一个一个找,最后在/usr/include/mysql 这个目录下找到了mysql.h这个文件,有这个文件啊,为什么编译不能通过呢?查资料后才知道是要加 mysql.h这个文件的路径,
运行:g++ mysql.cpp -o mysql -I/usr/include/mysql
显示:/tmp/cc9s577c.o:在函数‘main’中:

mysql.cpp:(.text+0x16):对‘mysql_init’未定义的引用

mysql.cpp:(.text+0x51):对‘mysql_real_connect’未定义的引用

collect2: 错误:ld 返回 1
又出错了,找原因吧。网上说:通过在链接命令后增加“-Ldir_path -lmysqlclient”选项,应能解决该问题,其中,dir_path代表客户端库所在目录的路径名。
继续运行:g++ mysql.cpp
-o mysql -I/usr/include/mysql -Ldir_path -lmysqlclient
结果依旧出错了:/usr/bin/ld: cannot find -lmysqlclient collect2: 错误:ld 返回 1
继续找原因,是因为找不到 libmysqlclient.so这个动态链接库,
find . -name "libmysqlclient"
显示:find: ‘./run/user/1000/gvfs’: 权限不够
额,权限不够,怎么回事,我已经是root账户了,百思不得其解。
只能在可能的文件夹了找libmysqlclient,皇天不负有心人,终于让我在/usr/lib64/mysql中找到了这个文件,
最终执行:g++ mysql.cpp -o mysql -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
结果成功,运行./mysql
结果:successful!
至此我总算是完成了这一系列的工程,走了很多弯路,吃了很多亏,总算是把这个东西算是弄好了,希望初学者看了我这篇文章后可以少走很多弯路,别像我一样绕了很大一圈又回到原点了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: