本文应用于使用rpm的方式在openEuler系统上离线安装mysql:
一、下载并安装openSSL
1.下载openssl。设备上是有安装openssl的(可以通过命令行whereis openssl,或者openssl version 进行检测),版本是1.1.1,但是在初始化mysql的时候总是提示:
error while loading shared libraries: libssl.so.3: cannot open shared object file: No Such File
翻遍了也搜不到libssl.so.3这个库文件。于是决定重装(升级)openssl。
https://www.openssl.org/source/
先到这个地址,下载最新版的openssl,在服务器的/usr下创建一个openssl文件夹,并且将文件上传到这个文件夹,解压文件
tar -xzf openssl-3.2.0.tar.gz
解压后有一个openssl-3.2.0的文件夹,进入文件夹。
2.分别执行以下命令进行安装,特别是第二条命令耗时非常长,耐心等待。
./config shared zlib --prefix=/usr/local/openssl
make
make install
./config -t
make depend
cd /usr/local
ln -s openssl ssl
3.修改配置文件,执行:
vim /etc/ld.so.conf
在文末加上一行/usr/local/openssl/lib
执行
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig
执行
vim /etc/profile
在打开的配置文件中的末端添加
export OPENSSL=/usr/local/openssl/bin
export PATH=$OPENSSL:$PATH:$HOME/bin
至此,openssl安装完毕。但是!reboot后执行
ldconfig -p | grep libssl.so.3
还是没有任何输出。查了一下在/usr/local/openssl/lib64下有libssl.so.3这个文件。
执行
vim /etc/ld.so.conf
在文末添加一行
/usr/local/openssl/lib64
保存后执行ldconfig,即可。
二、下载并安装mysql
下载地址:
https://dev.mysql.com/downloads/mysql/
最新版的是8.0.35。朋友们,听我一劝,千万不要用8.0.32,踩过大坑想哭,此为后话不展开。
下载这个版本的mysql
在服务器的/usr下创建一个mysql目录,把安装包扔上去并解压
tar -xvf mysql-8.0.35-1.el8.x86_64.rpm-bundle.tar
然后依次执行以下命令进行安装
rpm -ivh mysql-community-common-8.0.35-1.el9.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-client-plugins-8.0.35-1.el9.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-libs-8.0.35-1.el9.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-client-8.0.35-1.el9.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-icu-data-files-8.0.35-1.el9.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-server-8.0.35-1.el9.x86_64.rpm --nodeps --force
安装完毕后配置
vim /etc/my.cnf
在这个文件中添加以下内容
# Mysql8 配置文件
# 客户端设置
[client]
socket=/data/mysql-data/mysql.sock
# 主服务器设置
[mysqld]
# 数据目录
datadir=/data/mysql-data
# 服务端套接字位置
socket=/data/mysql-data/mysql.sock
#服务端端口号,默认为 3306
port = 3306
##
[mysqld]
# 默认字符集
character-set-server=utf8mb4
# 默认排序规则
collation-server=utf8mb4_general_ci
##
[mysqld]
# 启用 InnoDB 存储引擎
default-storage-engine=InnoDB
# InnoDB 缓冲池大小,根据服务器内存大小进行调整
innodb_buffer_pool_size=2G
# InnoDB 日志文件大小,根据服务器磁盘空间进行调整
#innodb_log_file_size=512M
innodb_redo_log_capacity=512M
##
[mysqld]
# 慢查询日志,记录执行时间超过 1 秒的 SQL 语句
slow_query_log=1
slow_query_log_file=/data/mysql-logs/slowlog/mysql-slow.log
long_query_time=1
# error日志
log-error=/data/mysql-logs/mysql.log
# 二进制日志binlog
log-bin=/data/mysql-logs/binlog/mysql-bin
## binlog日志保留时间
#expire_logs_days=30
binlog_expire_logs_seconds=30
## 每个二进制日志文件的最大大小为 1G
max_binlog_size= 1024M
## binlog格式
binlog_format=ROW
#binlog缓冲大小 既减少磁盘I/O,满足性能要求;又保证Cache无残留,及时持久化,满足安全要求。
binlog_cache_size = 4m
#为每个session 最大可分配的内存,在事务过程中用来存储二进制日志的缓存。
max_binlog_cache_size = 512m
##
[mysqld]
# 超时时间:MySQL服务器在空闲一段时间后自动关闭连接的时间
## 等待用户输入的时间后自动关闭连接的时间
interactive_timeout=28800000
## 等待客户端发送请求的时间后自动关闭连接的时间
wait_timeout=28800000
# 网络超时:MySQL服务器在读取和写入数据时所等待的时间
net_read_timeout=3600
net_write_timeout=3600
##
[mysqld]
# 最大连接数,根据服务器负载进行调整
max_connections=500
# 最大并发连接数,根据服务器负载进行调整
max_user_connections=100
# 临时表大小限制,根据应用需要进行调整
tmp_table_size=512M
max_heap_table_size=512M
# MySQL的缓存参数
## 定义MySQL服务器在内存中打开表的数量 根据实际情况调整
table_open_cache=500
## 定义MySQL服务器缓存表定义的数量 根据实际情况调整
table_definition_cache=500
# 优化网络设置
skip_name_resolve=1
# 表名大小写不敏感
lower_case_table_names=1
# 最大上传大小
max_allowed_packet=1024M
# 最大打开文件数
open_files_limit=65535
##
[mysqld]
# 主从复制设置
## 服务器标识
server_id=1
## 不需要同步得表
replicate-ignore-db=information_schema,mysql,performance_schema
以上是网上找到的,仅供参考。我自己的设置是这样的:
[mysqld]
#这里有很多东西,都是打了井号的,都是注释,不必理会
datadir=/data/mysql-data
socket=/data/mysql-data/mysql.sock
log-error=/data/mysql-logs/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names=1
default_authentication_plugin=mysql_native_password
max_allowed_packet=64M
max_connections=1000
创建mysql的数据目录
mkdir -p /data/{mysql-data,mysql-logs}
mkdir -p /data/mysql-logs/{slowlog,binlog}
运行命令
mysqld --initialize --user=mysql 芜湖,不行,提示
mysqld: /usr/lib64/libstdc++.so.6: version GLIBCXX_3.4.29' not found (required by mysqld) mysqld: /usr/lib64/libstdc++.so.6: version
CXXABI_1.3.13' not found (required by mysqld) mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /usr/lib64/mysql/private/libprotobuf-lite.so.3.19.4)
这是由于8.0.35版本的原因,需要更高版本的libstdc++.so.6支持。
通过执行
ls /usr/lib64/libstdc++.so.*
可知本机版本是6.0.28
执行
strings /usr/lib64/libstdc++.so.6 |grep GLIBC
可看出最大版本号是GLIBCXX_3.4.28,而我们报错的提示是找不到3.4.29的,高了一个版本,所以要下载更高版本的,文件从网上收集好并上传:
https://download.csdn.net/download/tizi666666/88622750
下载完成后,把它上传到/usr/lib64/目录下,然后执行以下命令:
#切换到工作目录
cd /usr/lib64/
#把原有的备份一下
mv ./libstdc++.so.6 ./libstdc++.so.6_bak
#重新建立软连接
sudo ln -s libstdc++.so.6.0.29 libstdc++.so.6
#查看
ls -l libstdc++.so.6
库文件重新进行软连接后可以查看到已经有了最新的GLIBCXX_3.4.29了
再次执行
mysqld --initialize --user=mysql
成功,没有异常提示
接着就开始运行了,执行一下代码
systemctl start mysqld
芜湖,又来报错了~报了好多的错误,这些错误都可以在/data/mysql-logs/mysqld.log中查看,逐条过逐条排故,警告类的可以不用管了解一下就好。
总结一下主要的错误有:
①提示某个文件夹没有权限,这个就很简单了,chmod命令,直接给个777!提示哪个路径有问题就盘它:1.检查一下目录/路径/文件是否存在,不存在就创建它;2.直接给它个777的权限,文件夹也给,文件也给,全都给给给!
②另一个折腾了我很久的问题,报告了一个这样的错误:
2023-12-12T13:48:03.188102Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
思前想后,一整个下午配了那么多东西,data文件里面乱七八糟的(主要是my.cnf修改了好几次),干脆删掉先前配置的/data下的mysql-data这个目录!然后重新再来一次mysqld --initialize --user=mysql进行初始化,初始化后再启动,好了!没报错误了!说明mysql已经顺利跑起来,尝试mysql -u root -p登录一下。如果配置是正确的话,此时应提示密码错误问题,如果配置不正确,就会提示其他别的原因。
接下来就是配置账号密码了。网上有很多的mysql的获取密码的说法,说是会在log文件中有记录一个随机码,可是我一直都找不到。
于是尝试绕开密码验证环节:
1.reboot重启了一下服务器
2.执行
vim /etc/my.cnf
再一次进入到配置
在最后一行添加一句:
skip-grant-tables
然后保存退出
3.重启一下mysql服务
systemctl restart mysqld
执行完之后,直接输入mysql,什么都不用带,直接能进去了,这时候就可以“为所欲为”了!
首先是要修改root的密码。
如果直接输入
ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';
是不行的,会提示说
The MySQL server is running with the --skip-grant-tables option so it cannot
这时候可以尝试
①退出数据库再进入数据
②然后执行
flush privileges;
刷新权限表
③再一次执行上述提到的修改密码命令。
PS:网上有些人用
ALTER USER 'root'@'local' IDENTIFIED BY '密码';
我试过不行,得用localhost才行,库里的访问地址host设置的是“localhost”
④再退出数据库,把原本添加上去的skip-grant-tables注释掉(切记,一定要注释掉,否则端口号会为0,无论怎么配置,这样的后果就是,远程无法登录)
⑤测试一下新设置的账号密码是否能够正常登录。
致此,整个sql的安装工作就完成了!大功告成,掌声!~~~
补充:
由于在整个安装的过程中出了很多问题,所以一直在频繁地看日志。发现日志中有一个问题,就是日志的时间是不对的,相差了8个小时,所以配置成功mysql后第一件事就是执行
SELECT @@global.time_zone AS '全局时区', @@session.time_zone AS '会话时区';
额,一切正常,是跟随system的。
执行select now();
显示的也是正常的时间。
退出系统,查看系统时间
timedatectl status
也是正常的。后来查过才知道,有个参数log_timestamps是用来配置日志的时间的,默认是UTC,所以时间打印会有问题。于是到etc/my.cnf去配置一下log_timestamps=system
让日志时间跟随系统就好了,接着重启数据库,再打开日志看,日志变了:
原本的Z变成了+8,这样时间就对得上了~虽然对数据库的运行影响不大,但是出了问题的时候看着日志也好判别。
20231213补充:
今天服务器的DNS有点问题,工程师帮我重新配置之后重启了一下,居然发现,mysql启动失败了。查日志显示,找不到GLIBCXX_3.4.29????奇怪了我昨天都更新了libstdc++.so.6的版本了啊!一怒之下,不使用软连接了,直接把/usr/lib64/下面的libstdc++.so.6删掉,然后吧下载好的libstdc++.so.6.0.29改名为libstdc++.so.6。然后运行正常。百思不得其解,到处翻也找不出原因。关键是,我配置完数据库也不是第一次重启了的,为什么之前的时候都不会,这次重启就会导致软连接失效了呢~~~
20231214补充:
这两天一直发现一个问题,每天第一次远程连接数据,或者是,吃了个饭回来再读数据库,只是一个简单的select语句,表里只有一条记录,大概需要7-15秒的时间,系统显示获取时间是1ms。再之后再读写就不存在问题了。网上搜了一下问题,有一个解决方法,先试试再说吧:
在数据库里执行
show variables like 'innodb_buffer_pool_size';
显示数值是134217728。
134217728/1024/1024=128M,这个缓存有点小。网上建议设置成内存的50%-75%这样子。
所以我直接干个24G吧!
24G*1024*1024*1024=25769803776
所以执行
set global innodb_buffer_pool_size =25769803776
再重启数据库?那不行,重启之后就失效了的、、、、所以修改my.cnf文件才是硬道理。
vim /etc/my.cnf
在最后一行加上
innodb_buffer_pool_size =25769803776
#懒得计算也可以使用innodb_buffer_pool_size =24G
再看看效果咋样吧哈!~
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!