mysql学习笔记---mysql的安装--编译安装

有凯泽
2023-12-01

编译安装(源码安装)

注:准备一台全新的虚拟机,配置最好是: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 的数据文件

 类似资料: