本文共 12865 字,大约阅读时间需要 42 分钟。
编译安装(源码安装)
注:准备一台全新的虚拟机,配置最好是:4G 2核 否则可能在最后安装时卡死
1,将rpm源码包(官方网站下载)上传到linux里
[root@localhost ~]# lsanaconda-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已加载插件:fastestmirrorLoading 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 ~]# lsanaconda-ks.cfg mysql-community-5.7.29-1.el7.src.rpm rpmbuild
解压真正的源码包
[root@localhost ~]# cd rpmbuild/[root@localhost rpmbuild]# lsSOURCES SPECS[root@localhost rpmbuild]# cd SOURCES/[root@localhost SOURCES]# SL-bash: SL: 未找到命令[root@localhost SOURCES]# lsboost_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]# lsboost_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]# lsboost_1_59_0 cmd-line-utils Doxyfile-perfschema libbinlogstandalone man plugin source_downloads support-files winBUILD config.h.cmake extra libmysql mysql-test rapid sql testclients zlibclient configure.cmake include libmysqld mysys README sql-common unittestcmake dbug INSTALL libservices mysys_ssl regex storage VERSIONCMakeLists.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]# lsbin include LICENSE mysql-test README-test support-filesdocs lib man README share[root@localhost sc_mysql]# getenforceEnforcing#临时关闭selinux[root@localhost sc_mysql]# setenforce 0[root@localhost sc_mysql]# service firewalld stopRedirecting to /bin/systemctl stop firewalld.service#关闭防火墙的开机自启[root@localhost sc_mysql]# systemctl disable firewalldRemoved 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]# lsinnochecksum mysqladmin mysqld_multi mysqlpump mysql_upgradelz4_decompress mysqlbinlog mysqld_safe mysql_secure_installation mysqlxtestmyisamchk mysqlcheck mysqldump mysqlshow perrormyisam_ftdump mysql_client_test mysqldumpslow mysqlslap replacemyisamlog mysql_client_test_embedded mysql_embedded mysql_ssl_rsa_setup resolveipmyisampack mysql_config mysqlimport mysqltest resolve_stack_dumpmy_print_defaults mysql_config_editor mysql_install_db mysqltest_embedded zlib_decompressmysql mysqld mysql_plugin mysql_tzinfo_to_sql[root@localhost bin]# ls /datals: 无法访问/data: 没有那个文件或目录[root@localhost bin]# ./mysql --initialize --user=mysql --basedir=/usr/local/sc_mysql/ --datadir=/data/mysqlmysqld: 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/mysql2020-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=457902020-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]# lsbin 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.sockport = 3309open_files_limit = 8192innodb_buffer_pool_size = 512M[mysql]auto-rehashprompt=\\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 mysqldroot 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.pidmysql 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=3309root 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 2Server version: 5.7.29Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.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 #####################################新建用户mysqluseradd -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.gztar xf boost_1_59_0.tar.bz2#将boost包移动到mysql解压的包里,并进入mysql 目录mv boost_1_59_0 mysql-5.7.29cd 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#关闭防火墙firewalldservice firewalld stop#不让防火墙开机自启 systemctl disable firewalld#关闭selinux#临时关闭selinux#永久关闭selinuxsetenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config #mysql的初始化操作mkdir /data/mysql -pchown 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服务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 的数据文件
转载地址:http://yqlzi.baihongyu.com/