接上一篇
应用容器化改造-CSDN博客https://blog.csdn.net/weixin_53439529/article/details/137045255应用后端需要写入数据库,比较方便的就是在服务器自建一个mysql数据库,还能顺便测一下并发数对后端数据库服务器的压力。
【 rpm安装】 X86的虚拟机可以用rpm包安装数据库,比较方便:cd /opt
#获取安装包:
mkdir mysql_install
tar -xvf MySQL-5.6.45-1.el6.x86_64.rpm-bundle.tar -C mysql_install
cd mysql_install
yum -y remove mariadb*
yum install -y MySQL-shared-compat-5.6.45-1.el6.x86_64.rpm
yum install -y MySQL-server-5.6.45-1.el6.x86_64.rpm
yum install -y MySQL-client-5.6.45-1.el6.x86_64.rpm
yum install -y MySQL-devel-5.6.45-1.el6.x86_64.rpm
yum install -y MySQL-shared-5.6.45-1.el6.x86_64.rpm
如果没有网络环境,离线的rpm文件安装也可以:rpm -ivh --force 文件.rpm
【修改配置文件】
新增my.cnf配置:
cat << EOF >> /etc/my.cnf
[mysqld]
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
lower_case_table_names = 1
innodb_strict_mode = 1
sql_mode =
symbolic-links=0
character_set_server = utf8
log-bin = mysql-bin
binlog_format=row
server-id = 2
expire_logs_days = 10
slave_skip_errors = 1062
innodb_strict_mode = 0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF
cat /etc/my.cnf
直接在/etc/新增了my.cnf文件
如果mysql本身的配置文件my.cnf该有的配置都有,也可以备份然后vim原来的my.cnf文件,软链接到/etc/my.cnf:
修改配置文件:cp my.cnf my.cnf_bak
vim /etc/my.cnf
创建配置文件的软链接
ln -sf /usr/local/mysql/my.cnf /etc/my.cnf
【启动服务】
systemctl start mysql
systemctl status mysql
【添加环境变量】
有时候启动mysql或mysqld服务,会找不到mysql_home地址,需要先把mysql的位置加到环境变量里:
vim /etc/profile
# 在尾部添加
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
刷新环境变量
source /etc/profile
【 修改密码】#用脚本修改密码,这个方法好处是不用进mysql操作比较简单,但是需要安装expect插件:vim mysql_pass.sh
#!/bin/bash
# 安装expect插件
yum install -y expect
# 修改密码为password(/root/.mysql_secret是数据库安装过程中自动生成的密码文件,保存原始密码,也有可能没有)
pass=`awk -F"[ :]+" 'NR==1{print $NF}' /root/.mysql_secret`
/bin/expect << EOF
spawn /usr/bin/mysql -h127.0.0.1 -uroot -p`echo -e $pass`
expect "mysql>"
send "SET PASSWORD FOR root@localhost=PASSWORD('password');"
send "\n"
expect "mysql>"
send 'flush privileges\n'
expect "mysql>"
send 'quit\n'
interact
EOF
chmod +x mysql_pass.sh
./mysql_pass.sh
【设置访问权限】
设置mysql数据库允许其他用户远程连接(对应10038错误):
修改远程mysql的配置文件,取消bind-addresss属性的默认值127.0.0.1,以允许其他用户进行连接。安装后可能会存在多个.cnf配置文件,所以需要找出有效的配置文件所在位置 并对其进行修改
cd /etc/mysql/
查看mysql的真实/有效的配置文件位置 ( grep -rn "skip-networking" *)
修改真实的mysql配置文件
注释掉配置文件中 bin-address属性: # bind-address=127.0.0.1
设置或授权访问用户(对应1130错误):
通过上一步操作,服务器上的MySQL已经可被远程连接了,但是光这样还不行,还必须对访问的所有用户进行设置或授权,之后才可以正常远程连接。
/usr/bin/mysql -uroot -p
grant all privileges on *.* to root@"%" identified by "password";
flush privileges;
【XC环境安装】
XC服务器是飞腾ARM64-UOS统信操作系统,对应的linux版本为debian,debian是不能用rpm安装的,但是服务器可以出网访问,所以直接apt安装就行
apt install -y mysql-server-5.7(最好是指定版本,自动获取的版本有问题)
【修改my.cnf文件】
与X86方式一致。
【 修改密码】因为debian环境自动获取的数据库安装时没有生成临时密码文件,所以用mysql_secure_installation命令修改mysql密码,用该密码登录进去mysql -u root -p
SELECT User, Host, authentication_string FROM mysql.user WHERE User='root';
可以看到root@localhost 是空的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';没有生效
SET PASSWORD FOR root@localhost = 'password';
这个命令有点问题:'root'@'localhost' as authentication plugin does not support it. 该错误提示表明使用的身份验证插件不支持通过 SET PASSWORD 语句更改密码。要确定使用的身份验证插件,可以运行以下命令:
SHOW VARIABLES LIKE 'default_authentication_plugin';
显示mysql_native_password
更改语句为:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
commit;
flush privileges;
为了达到密码强度要求,密码要设置比较复杂,如果要改简单密码,可以运行以下命令临时禁用密码验证插件:
UNINSTALL PLUGIN validate_password; 然后修改成简单点的密码(最好不要)
另一种方式:
mysql5.7安装完成后,root用户密码默认为空:输入mysql回车后显示了mysql的相关信息,表示已登录到mysql服务器了,也就表示初始/默认密码为空。所以需要设置一下root用户密码。
SET PASSWORD FOR root@localhost=PASSWORD('xuyijing0103!');
flush privileges;
修改成功后,即可通过执行:mysql -uroot -p 回车,输入密码,回车登录
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
flush privileges;
【离线安装】
有时候XC服务器没有网络环境,也就没法apt自动install,也可以使用离线安装包安装,当然需要先获取arm架构的离线包:
https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz
#关闭防火墙禁止开机自动启动
systemctl stop firewalld.service && systemctl disable firewalld.service && service iptables stop
#关闭SELINUX
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
#创建mysql用户和组,mysql用户不能登录系统选项,不创建用户的主目录。
groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin -M mysql
#卸载系统自带的依赖包,会存在冲突
rpm -qa | grep mariadb
rpm -qa | grep mysql
rpm -e --nodeps 删除已经安装的MYSQL包
wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz
tar -xvf mysql-5.7.27-aarch64.tar.gz -C /usr/local/
将解压后的目录改名为 mysql
cd /usr/local/
mv mysql-5.7.27-aarch64 mysql
chown -R mysql mysql/
chgrp -R mysql mysql/
cd mysql/
mkdir data
chown -R mysql:mysql data
安装依赖:yum install -y libaio* libatomic* libstdc*
cp -rf /usr/local/mysql/extra/lib* /usr/lib64/
mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.old
ln -s /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6
修改配置文件:cp my.cnf my.cnf_bak
vim /etc/my.cnf
创建配置文件的软链接
ln -sf /usr/local/mysql/my.cnf /etc/my.cnf
#无密码初始化
mysqld --initialize-insecure
#开启mysql
systemctl start mysqld
离线初始化mysqld报了一个很诡异的错误:mysqld --initialize-insecure --user=mysql
-bash: mysqld: command not found已经安装了mysql还提示没有,而且直接mysql命令也提示ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/dev/shm/mysql.sock' (2) 到dev/shm/目录下查看确实没有这个本地链接服务器,说明MySQL 服务器没有正常安装上。
systemctl status mysql 里面也有错误:-- The unit mysqld.service has entered the 'failed' state with result 'exit-code'. Mar 22 18:11:06 0002.novalocal systemd[1]: Failed to start LSB: start and stop MySQL.
一开始以为是指定的安装目录没有写入的权限,结果改了一下目录还是没有权限:mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql_install/data/mysql --datadir=/opt/mysql_install/data/mysql_data mysqld: Can't change dir to '/opt/mysql_install/data/mysql_data/' (Errcode: 13 - Permission denied)
总不能是所有的服务器目录都没有权限吧,所以怀疑是使用的用户没有权限,但是登录用的是root,只有安装mysql用的是一个新建的用户mysql,在系统日志message.log里面有更详细的错误:Starting MySQL.... ERROR! The server quit without updating PID file (/var/lib/mysql/data/mysql.pid). Mar 26 19:59:40 i-p272ozdj systemd[1]: mysqld.service: Control process exited, code=exited, status=1/FAILURE
怀疑是这个新用户mysql没有权限写入pid文件,MySQL 服务器启动时可能无法写入 PID 文件所在的目录。但是mysql安装目录下所有文件都是owner都是mysql,而且读写权限也都授权了,无奈。把用户换成root用户就可以了,可能是服务器交付时做了什么限制。
【 卸载 MySQL】打开终端,使用 root 用户或具有管理员权限的用户登录。
停止 MySQL 服务:systemctl stop mysql
移除 MySQL 包:apt remove --purge mysql-server mysql-client mysql-common
此命令将卸载 MySQL 服务器、客户端和共享组件。
移除与 MySQL 相关的配置文件:rm -rf /etc/mysql /var/lib/mysql /var/log/mysql
这将删除 MySQL 的配置文件、数据目录和日志文件。
清理残余的数据库文件:apt autoremove
此命令将自动删除可能仍然存在的 MySQL 相关的依赖项和残余文件。
在卸载 MySQL 数据库之前,确保已备份重要的数据库和数据。
---------------------------------------------------------------------------------------------------------------------------------
最新申请了一个鲲鹏虚拟机,安装mysql有又出现一个怪怪的问题,其实之前也出现过,但是一顿操作就没有了,也不知道是怎么解决的,这次倒是正好找到原因了,报错如下:
systemctl start mysqld启动报错Failed to start mysqld.service: Unit mysqld.service not found.
systemctl start mysql也一样,总是报错服务单元不存在,但是很确定mysql已经安装成功了。在/etc/init.d下是服务单元的配置信息,并没有mysqld,感觉是没有自动把mysqld.service注册到服务里面。
#手动把mysql服务软链接到服务单元,mysql设置开机自启动也需要这一步
cp -rf /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
#重新加载服务 systemctl daemon-reload
这时候再启动mysql就正常了