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

时间:2021-11-26 11:27:43

这几天因为要用到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!

至此我总算是完成了这一系列的工程,走了很多弯路,吃了很多亏,总算是把这个东西算是弄好了,希望初学者看了我这篇文章后可以少走很多弯路,别像我一样绕了很大一圈又回到原点了。