编译安装(源码安装)
注:准备一台全新的虚拟机,配置最好是:4G 2核 否则可能在最后安装时卡死
1,将rpm源码包(官方网站下载)上传到linux里
[root@localhost ~]# ls
anaconda-ks.cfg mysql-community-5.7.29-1.el7.src.rpm
2,手动解决依赖关系
[root@localhost ~]# yum install cmake ncurses-devel gcc gcc-c++ vim lsof bzip2 openssl-devel -y
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.cn99.com
软件包 2:vim-enhanced-7.4.629-6.el7.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
3,解压.rpm结尾的文件
[root@localhost ~]# rpm -ivh mysql-community-5.7.29-1.el7.src.rpm
警告:mysql-community-5.7.29-1.el7.src.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
正在升级/安装...
1:mysql-community-5.7.29-1.el7 ################################# [100%]
[root@localhost ~]# ls
anaconda-ks.cfg mysql-community-5.7.29-1.el7.src.rpm rpmbuild
解压真正的源码包
[root@localhost ~]# cd rpmbuild/
[root@localhost rpmbuild]# ls
SOURCES SPECS
[root@localhost rpmbuild]# cd SOURCES/
[root@localhost SOURCES]# SL
-bash: SL: 未找到命令
[root@localhost SOURCES]# ls
boost_1_59_0.tar.bz2 filter-provides.sh filter-requires.sh mysql-5.6.45.tar.gz mysql-5.7.29.tar.gz
[root@localhost SOURCES]# tar xf boost_1_59_0.tar.bz2
[root@localhost SOURCES]# tar xf mysql-5.7.29.tar.gz
[root@localhost SOURCES]# ls
boost_1_59_0 boost_1_59_0.tar.bz2 filter-provides.sh filter-requires.sh mysql-5.6.45.tar.gz mysql-5.7.29 mysql-5.7.29.tar.gz
#将boost_1_59_0 移动到解压后的mysql-5.7.29里
[root@localhost SOURCES]# mv boost_1_59_0 mysql-5.7.29
[root@localhost SOURCES]# cd mysql-5.7.29
[root@localhost mysql-5.7.29]# ls
boost_1_59_0 cmd-line-utils Doxyfile-perfschema libbinlogstandalone man plugin source_downloads support-files win
BUILD config.h.cmake extra libmysql mysql-test rapid sql testclients zlib
client configure.cmake include libmysqld mysys README sql-common unittest
cmake dbug INSTALL libservices mysys_ssl regex storage VERSION
CMakeLists.txt Docs libbinlogevents LICENSE packaging scripts strings vio
4,编译前的配置,执行cmake
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/sc_mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=boost_1_59_0
cmake 是一个编译器,就是将c语言编写的代码翻译成机器可以执行的二进制的程序。
gcc 也是一个编译器
-DCMAKE_INSTALL_PREFIX 是编译安装MySQL的时候的固定语法参数,是给cmake传参的,告诉cmake 去生成一个叫做Makefile的文件
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
指定MySQL安装的路径/usr/local/mysql 具体的路径可以自己定义
-DMYSQL_DATADIR=/data/mysql -->指定MySQL的存放数据(仓库)的目录 具体的路径可以自己定义
-DSYSCONFDIR=/etc --指定MySQL的配置文件存放的目录
-DMYSQL_USER=mysql --指定启动mysql的用户 用户名可以自己定义
mysql这个用户是否会在编译安装的时候,自动新建?还是需要我们自己去创建?
答案是需要我们自己创建
-DDEFAULT_CHARSET=utf8 指定MySQL里的默认的字符集为utf8
不指定时默认的字符集:Latin1
-DDEFAULT_COLLATION=utf8_general_ci 指定字符集的校对规则
COLLATION 排序规则 utf8_general_ci utf8里的排序规则,不区分大小写
-DWITH_BOOST=boost_1_59_0 指定boost源码的位置在mysql源码的当前目录下一个叫boost_1_59_0的文件夹
boost 是什么?
Boost提供免费的经过同行评审的可移植C ++源库。 boost这个软件是 c++的支持
5,编译安装(需要很久,如果虚拟机配置不够好,最好不要接 -j 2 ,可能会卡死)
make -j 2 && make install
6,进入安装目录,关闭防火墙和selinux
[root@localhost mysql-5.7.29]# cd /usr/local/sc_mysql
[root@localhost sc_mysql]# ls
bin include LICENSE mysql-test README-test support-files
docs lib man README share
[root@localhost sc_mysql]# getenforce
Enforcing
#临时关闭selinux
[root@localhost sc_mysql]# setenforce 0
[root@localhost sc_mysql]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
#关闭防火墙的开机自启
[root@localhost sc_mysql]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
#永久关闭 将enforcing 改位disabled
[root@localhost sc_mysql]# vim /etc/sysconfig/selinux/config
#或者 sed -i 's/enforcing/disabled' /etc/sysconfig/selinux/config
mysql的初始化操作
[root@localhost sc_mysql]# cd bin
[root@localhost bin]# ls
innochecksum mysqladmin mysqld_multi mysqlpump mysql_upgrade
lz4_decompress mysqlbinlog mysqld_safe mysql_secure_installation mysqlxtest
myisamchk mysqlcheck mysqldump mysqlshow perror
myisam_ftdump mysql_client_test mysqldumpslow mysqlslap replace
myisamlog mysql_client_test_embedded mysql_embedded mysql_ssl_rsa_setup resolveip
myisampack mysql_config mysqlimport mysqltest resolve_stack_dump
my_print_defaults mysql_config_editor mysql_install_db mysqltest_embedded zlib_decompress
mysql mysqld mysql_plugin mysql_tzinfo_to_sql
[root@localhost bin]# ls /data
ls: 无法访问/data: 没有那个文件或目录
[root@localhost bin]# ./mysql --initialize --user=mysql --basedir=/usr/local/sc_mysql/ --datadir=/data/mysql
mysqld: Can't create directory '/data/mysql/' (Errcode: 2 - No such file or directory)
2020-10-06T02:23:39.255295Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-10-06T02:23:39.270889Z 0 [ERROR] Aborting
#出错原因:没有/data/mysql 这个目录
#出错的解决方法:新建该文件夹,并给他赋予权限
[root@localhost bin]# mkdir /data/mysql -p
[root@localhost bin]# chown mysql:mysql /data/mysql
[root@localhost bin]# chmod 750 /data/mysql/
再执行
[root@localhost bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/sc_mysql/ --datadir=/data/mysql
2020-10-06T02:26:49.252101Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-10-06T02:26:50.036421Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-10-06T02:26:50.130409Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-10-06T02:26:50.189169Z 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: 63d02d8d-077b-11eb-b65c-000c293ff2d9.
2020-10-06T02:26:50.190548Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-10-06T02:26:50.939009Z 0 [Warning] CA certificate ca.pem is self signed.
2020-10-06T02:26:51.128481Z 1 [Note] A temporary password is generated for root@localhost: sDg;ks3/y:pD
#最后一行是临时密码,用于第一次登陆
修改环境变量,复制mysql.server 文件(即mysqld的启动脚本到/etc/init.d 配置文件下 )
[root@localhost bin]# PATH=$PATH:/usr/local/sc_mysql/bin
[root@localhost bin]# cd ..
[root@localhost sc_mysql]# ls
bin docs include lib LICENSE man mysql-test README README-test share support-files
[root@localhost sc_mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost sc_mysql]# service mysqld start
Starting MySQL.2020-10-06T03:01:07.813030Z mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'.
ERROR! The server quit without updating PID file
(/var/lib/mysql/localhost.localdomain.pid).
#出错原因,存在mariadb的配置文件,先清空,再添加新的配置内容
[root@localhost sc_mysql]# >/etc/my.cnf
[root@localhost sc_mysql]# cat /etc/my.cnf
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3309
open_files_limit = 8192
innodb_buffer_pool_size = 512M
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m mysql>
配置文件详解
[mysqld_safe] ----对应mysqld_safe进程,父进程
[client]
socket=/data/mysql/mysql.sock ---指定socket文件存放的路径,让mysqld进程与客户端执行的mysql命令进程通信
[mysqld] ----对应mysqld进程 子进程 当用kill -9 杀死mysqld 进程后 父进程mysqld_safe 会自动创建一个新的mysqld子进程
socket=/data/mysql/mysql.sock --两个地方都要写,socket是进程与进程之间通信的一种方式
port = 3306 -----指定端口号
open_files_limit = 8192 ------指定打开的最大文件数
innodb_buffer_pool_size = 512M ----默认存储引擎的大小--最大可以达到物理内存的80%
character-set-server=utf8 ----指定字符集utf8
[mysql] -------- 对应客户端mysql命令产生的进程
auto-rehash ----支持tab键自动补齐
prompt=\\u@\\d \\R:\\m mysql> ---- 提示符 u:用户 d:当前在哪个库(database)
\\R:\\m 当前时间
innodb 是mysql的存储引擎,简单来讲 就是mysql的一个模块,实现的功能就是将mysql在内存里的数据写到磁盘,或将磁盘里的数据读取到内存里
存储引擎的必要性:停电后/服务器异常关闭,内存里的数据会丢失,但磁盘里 的数据是永久写入的,不会丢失
buffer 缓存 :mysql 产生的数据临时存放的地方
启动服务
[root@localhost sc_mysql]# service mysqld start
Starting MySQL.Logging to '/data/mysql/localhost.localdomain.err'.
. SUCCESS!
#设置mysqld开机启动
[root@localhost sc_mysql]#chkconfig --add mysqld
#可以用chkconfig --list 查看mysqld是否开机启动
[root@localhost ~]# 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:关
#可以看到3和5是开启的
#linux的运行级别
#0:关机1:单用户2:多用户3:字符界面4:没使用5:图形界面6:重启
[root@localhost sc_mysql]# ps aux|grep mysqld
root 33036 0.1 0.0 11820 1616 pts/0 S 11:15 0:00 /bin/sh /usr/local/sc_mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/localhost.localdomain.pid
mysql 33178 5.3 5.1 2025908 200384 pts/0 Sl 11:15 0:01 /usr/local/sc_mysql/bin/mysqld --basedir=/usr/local/sc_mysql --datadir=/data/mysql --plugin-dir=/usr/local/sc_mysql/lib/plugin --user=mysql --log-error=localhost.localdomain.err --open-files-limit=8192 --pid-file=/data/mysql/localhost.localdomain.pid --socket=/data/mysql/mysql.sock --port=3309
root 33210 0.0 0.0 112824 980 pts/0 S+ 11:15 0:00 grep --color=auto mysqld
#可看到mysql有两个进程,则为编译安装的,一个的话是rpm安装的
#编译安装的mysql的端口号可以自己指定,eg:3309(可在配置文件中指定端口号)
#注:更改配置文件需要重新刷新服务:service mysqld restart
进入mysql,并修改密码
[root@localhost sc_mysql]# mysql -uroot -p'sDg;ks3/y:pD'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.29
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
root@(none) 11:17 mysql>alter user 'root'@'localhost' identified by 'Sanchuang123#';
Query OK, 0 rows affected (0.00 sec)
root@(none) 11:19 mysql>
安装完毕!
接下来,可以将上面的命令可以写成脚本,方便以后使用,实现一键安装
[root@localhost ~]# cat onekey_compile_install_mysql.sh
#!/bin/bash
#author:zwx
#time: 2020-10-6
#QQ:2624551985
####################################
#编译安装mysql 5.7.29
#os: centos7.8.2003
####################################
#新建用户mysql
useradd -s /sbin/nologin mysql
#解决软件的依赖关系
yum install cmake ncurses-devel gcc gcc-c++ vim lsof bzip2 openssl-devel -y
#解压rpm包
rpm -ivh mysql-community-5.7.29-1.el7.src.rpm
#进入/root/rpmbuild/SOURCES目录
cd /root/rpmbuild/SOURCES
#解压真正的源码包
tar xf mysql-5.7.29.tar.gz
tar xf boost_1_59_0.tar.bz2
#将boost包移动到mysql解压的包里,并进入mysql 目录
mv boost_1_59_0 mysql-5.7.29
cd mysql-5.7.29
#编译前的配置
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/sc_mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=boost_1_59_0
##编译和编译安装
make -j 2 && make install
#关闭防火墙firewalld
service firewalld stop
#不让防火墙开机自启
systemctl disable firewalld
#关闭selinux
#临时关闭selinux
#永久关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#mysql的初始化操作
mkdir /data/mysql -p
chown mysql:mysql /data/mysql/
chmod 750 /data/mysql/
cd /usr/local/sc_mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/sc_mysql/ --datadir=/data/mysql &>passwd.txt
#获得临时密码
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
#$NF表示最后一个字段
# abc=$(命令) 优先执行命令,然后将结果赋值给abc
#修改环境变量,添加我们编译安装的MySQL的可执行命令的路径
#只在当前终端有效
PATH=$PATH:/usr/local/sc_mysql/bin
#在新的终端生效
echo "PATH=$PATH:/usr/local/sc_mysql/bin" >>/root/.bashrc
#复制mysql提供的启动mysqld服务的脚本到/etc/init.d目录下-->复制mysqld的启动脚本
cp ../support-files/mysql.server /etc/init.d/mysqld
#生成/etc/my.cnf配置文件
cat >/etc/my.cnf <<EOF
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m mysql>
EOF
#启动mysqld服务
service mysqld start
#设置开机启动
chkconfig --add mysqld
#登录重新设置初始密码为Sanchuang123#
#初次修改密码需要使用--connect-expired-password 选项
mysql -uroot -p$tem_passwd --connect-expired-password -e "set password='Sanchuang123#';"
#验证密码是否设置成功
mysql -uroot -pSanchuang123# -e 'show databases;' && echo "database is installed success"
常见问题
关闭mysql
再登录mysql,会报错 找不到sock文件
[root@localhost ~]# mysql -uroot -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
socket 是进程与进程之间通信的一种方式
进程与进程之间通信的方式包括:
1,信号
2,信号量
3,管道
4,消息队列
5,共享内存
6,socket套接字
mysqld进程与socket文件之间的关系
mysqld(服务器端)--------------- >
(/var/lib/mysql/mysql.sock) 该文件有mysqld拥有(mysqld进程启动,就会存在这个文件,mysqld进程关闭,该文件就会消失)
------------>mysql(客户端的命令)
/var/lib/mysql 是mysql 的数据文件