centos7 编译安装mysql

mysql5.7版本和8版本的编译略有不同,所以这里分开讲。

源码编译、安装MySQL5.7

Mysql5.7版本更新后有很多变化,最主要的变化是安装MySQL必须要有BOOST库,不过MySQL的官网源码包也提供了带BOOST库的源码和不带BOOST库的源码两种.

下载源码包

官网

https://www.mysql.com/

点击downloads

选择社区版

https://dev.mysql.com/downloads/

选择服务器

选择历史版本

可以直接选择这个地址下载

https://downloads.mysql.com/archives/community/

安装依赖包

在开始安装MySQL之前,需要安装一些MySQL依赖的库文件包,为方便起见,这些依赖包我们通过yum方式进行安装,操作过程如下:
yum -y install make gcc-c++ cmake bison-devel ncurses-devel bison perl perl-devel perl perl-devel openssl openssl-devel

解压并创建mysql组和用户

可以通过MySQL官网去下载MySQL源码包,这里我们下载的版本是mysql-boost-5.7.36.tar.gz,下载完成后,传到需要安装的服务器上

进行解压,操作如下:
tar xvf mysql-boost-5.7.37.tar.gz -C /data
MySQL数据库需要以一个普通用户去执行一些操作,因而还需要创建一个普通用户和组,操作如下:
useradd -r -s /bin/false mysql

开始编译mysql

从MySQL5.5之后,MySQL的安装就开始使用cmake来代替传统的configure了

下面进入编译mysql环节,操作过程如下:

$ cd /data/mysql-5.7.37
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  \ #指定安装目录
-DMYSQL_DATADIR=/data/mysql  \ #指定数据目录
-DDEFAULT_CHARSETS=all   \ #指定安装的字符集
-DDEFAULT_CHARSET=utf8  \ #指定默认字符集
-DDEFAULT_COLLATION=utf8_general_ci  \ #指定默认排序规则
-DWITH_INNOBASE_STORAGE_ENGINE=1  \ #对存储引擎的选择 支持innob
-DWITH_MYISAM_STORAGE_ENGINE=1  \   #支持myisam引擎
-DMYSQL_USER=mysql  \  #指定运行数据库的用户
-DMYSQL_TCP_PORT=3306  \ #指定端口
-DWITH_BOOST=boost  \  #指定boost
-DENABLED_LOCAL_INFILE=1  \  #允许本地导入数据
-DWITH_PARTITION_STORAGE_ENGINE=1  \ #支持数据库分区
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock  \ #指定socket文件存放地址
-DWITH_EMBEDDED_SERVER=1
#安装
$ make && make install

初始化数据库

先给mysql用户数据目录的权限

$ cd /data
$ chown -R mysql:mysql mysql
$ ll mysql
drwxr-xr-x  2 mysql mysql        6 4月  25 09:05 mysql

MySQL安装完成后,接下来要做的就是初始化系统库(就是mysql数据库)

在mysql5.7之前的版本中,初始化脚本位于MySQL主程序安装目录下的scripts目录下,名为mysql_install_db

而在mysql5.7.20版本中,此脚本已经废弃,需要通过如下命令完成数据库初始化:

/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

  • --initialize-insecure:表示初始化时不生成mysql管理员用户root的密码。
  • --initialize:表示初始化时生成一个随机密码,此密码默认会显示在mysql的日志文件(默认是/var/log/mysqld.log)中
$ /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
2022-04-25T01:57:44.924287Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2022-04-25T01:57:45.130629Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-04-25T01:57:45.169808Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-04-25T01:57:45.241251Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 198cc1c8-c43b-11ec-b73e-000c29f242e7.
2022-04-25T01:57:45.241798Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-04-25T01:57:45.602719Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2022-04-25T01:57:45.602736Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2022-04-25T01:57:45.603222Z 0 [Warning] CA certificate ca.pem is self signed.
2022-04-25T01:57:45.686448Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
#最后一句表明给root@localhost设置了空密码

设置mysql配置文件my.cnf

MySQL的配置文件名为my.cnf,在启动MySQL服务的时候

启动程序默认会首先查找/etc/my.cnf文件

如果找不到会继续搜索"\(basedir/my.cnf"文件,其中`\)basedir`是MySQL主程序的安装目录

如果还是找不到,最后还会搜索~/.my.cnf文件。

因此,在启动MySQL前需要确认,是否已经存在/etc/my.cnf文件

如果存在,要先删除老的/etc/my.cnf文件,然后用新的my.cnf文件启动MySQL,很多MySQL启动失败,都是因为这个原因导致的。

#查看时间,发现是非常早的时间,这个就是系统自带的mariadb的配置文件,需要删除文件,重新写
$ ll /etc/my.cnf
-rw-r--r--. 1 root root 570 9月  30 2020 /etc/my.cnf
$ rm -rf /etc/my.cnf
$ vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysqld.sock
symbolic-links=0
log-error=/var/log/mysqld.log

配置mysql启动脚本

将脚本创建软连接存放在/etc/init.d目录下,方便之后用servic管理

ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

创建客户端快捷方式

ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

启动服务

/etc/init.d/mysqld start

#脚本的可用命令
$ /etc/init.d/mysqld --help
Usage: mysqld  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]
#启动后可以运行安全脚本
$ /usr/local/mysql/bin/mysql_secure_installation

查看进程

$ ps -ef | grep mysql
root      26477      1  0 10:31 pts/1    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/Centos7.9-0.5.pid
mysql     26619  26477  0 10:31 pts/1    00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysq --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/data/mysql/Centos7.9-0.5.pid --socket=/tmp/mysqld.sock
root      26696   1488  0 10:36 pts/1    00:00:00 grep --color=auto mysql

如果在初始化MySQL的时候设置了随机密码的话,虽然可以通过这个密码登录到数据库,但是,不论运行任何命令,总会提示如下信息:

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

这个提示是让用户必须重置密码才能执行SQL操作,在MySQL命令行执行如下三个命令即可:

mysql> SET PASSWORD = PASSWORD('your new password');/*设置密码*/
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;/* 设置永不过期 */
mysql> flush privileges;/*刷新权限*/

注册开机自启

先要保证已经将服务脚本或者脚本的快捷方式放到/etc/init.d中

ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

注册开机自启

$ chkconfig --add mysqld
$ chkconfig --list

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

mysqld         	0:关	1:关	2:开	3:开	4:开	5:开	6:关
netconsole     	0:关	1:关	2:关	3:关	4:关	5:关	6:关
network        	0:关	1:关	2:开	3:开	4:开	5:开	6:关
$ chkconfig mysqld off
$ chkconfig --list

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

mysqld         	0:关	1:关	2:关	3:关	4:关	5:关	6:关
netconsole     	0:关	1:关	2:关	3:关	4:关	5:关	6:关
network        	0:关	1:关	2:开	3:开	4:开	5:开

登录

由于之前初始化设置的是空密码

所以以下两种方式都可以登录

$ mysql
$ mysql -uroot -hlocalhost -p

登录进去后

grant all privileges on *.* to 'root'@'%' identified by '111111';

执行上面的一句,就可以给别的主机连数据库了

源码编译、安装MySQL8

https://downloads.mysql.com/archives/community/

#安装依赖
yum -y install make gcc gcc-c++ ncurses ncurses-devel bison libtirpc-devel cmake3 bison-devel bison perl perl-devel openssl openssl-devel

#安装rpcsvc-proto
tar xf rpcsvc-proto-1.4.3.tar.xz
cd rpcsvc-proto-1.4.3/
./configure 
make -j 2 && make install

#新建用户
useradd -r -s /bin/false mysql
mkdir /data/mysql
chown mysql.mysql /data/mysql
#升级为10.2.1版本
#安装第三方scl源仓库
yum -y install centos-release-scl
#安装gcc 10.2.1 的版本
yum install devtoolset-10-gcc devtoolset-10-gcc-c++ devtoolset-10-binutils -y
#激活gcc 10.2.1
scl enable devtoolset-10 bash
#编译安装mysql
tar xf mysql-boost-8.0.28.tar.gz
cd mysql-8.0.28
cmake3 . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock \
-DEXTRA_CHARSETS=all \
-DMYSQL_USER=mysql  \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLED_PROFILING=1 \
-DMYSQL_TCP_PORT=3306 \
-DWITH_DEBUG=0  \
-DDOWNLOAD_BOOST=0 \
-DFORCE_INSOURCE_BUILD=1 \
-DWITH_BOOST=boost
make -j 12 && make install
#新建快捷方式
ln -s /usr/local/mysql/bin/* /usr/local/bin/
#新建日志文件夹
mkdir -p /usr/local/mysql/logs/
#新建配置文件
rm -rf /etc/my.cnf
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
innodb_log_file_size=1024M
default-authentication-plugin=mysql_native_password
character-set-server=utf8
collation-server=utf8_bin
[client]
port=3306
default-character-set=utf8
socket=/data/mysql/mysql.sock

#修改根目录权限
chown -R mysql:mysql /usr/local/mysql/

#初始化
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

#复制服务管理脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

#添加服务
chkconfig --add mysqld

#启动服务
service mysqld start

#访问数据库
mysql

#修改root密码
mysql> alter user "root"@"localhost" identified by "111111";
mysql> flush privileges;
#新建用户
mysql> create user 'root'@'%' identified by '111111';
mysql> grant all privileges on *.* to "root"@'%';
mysql> flush privileges;

如果编译过程中出现下面的问题,可以通过扩展swap解决,或者接着再编译也行

解决方案:

#获取要增加的2G的SWAP文件块
dd if=/dev/zero of=/swapfile bs=1k count=2048000
#创建SWAP文件
mkswap /swapfile 
#激活SWAP文件
swapon /swapfile   
#查看SWAP信息是否正确
swapon -s  
#添加到fstab文件中让系统引导时自动启动
echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab

swapfile文件的路径在/var/下,编译完后, 如果不想要交换分区了, 可以删除。

删除交换分区:

swapoff /swapfile
rm -rf /swapfile

至此,问题解决。

posted @ 2022-12-18 21:36  厚礼蝎  阅读(363)  评论(0编辑  收藏  举报