本文主要提供在TaiShan 200 2280 硬件环境及Neokylin V7Update6系统环境上部署MySQL 8.0.17 的软件移植指导。
1 软件介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
2 预置条件
2.1 硬件配置
本文档基于TaiShan 200 2280硬件环境展开。
2.2 软件环境
1、 本文档基于新安装的NeoKylin Linux Advanced Server release V7Update6系统环境展开。
2、 系统安装时选择了Server with GUI。
3 配置环境
3.1 关闭防火墙并取消开机自启动
#systemctl stop firewalld.service
#systemctl disable firewalld.service
(测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置)
3.2 修改SELINUX为disabled(NeoKylinV7U6默认是disabled)
执行:#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
3.3 搭建数据盘
如数据目录使用单独硬盘,需要对磁盘进行格式化并挂载
1、 创建分区(以/dev/sdb为例,根据实际情况创建)
#fdisk /dev/sdb
分别输入:
n 回车确认;
p 回车确认;
1 回车确认;
按默认配置 回车;
默认配置 回车;
w 回车保存。
2、 创建文件系统(以xfs为例,根据实际需求创建文件系统)
#mkfs.xfs /dev/sdb1
3、 挂载分区到/data以供操作系统使用
#mkdir /data
#mount /dev/sdb1 /data
4、 编辑/etc/fstab使重启后自动挂载数据盘,添加如下标红行,其中/dev/nvme6n1替换为对应分区名称,如/dev/sdb1
3.4 创建用户、组和目录
服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离
1、 创建mysql用户(组)
#groupadd mysql
#useradd -g mysql mysql
2、 设置mysql用户密码
#passwd mysql
重复输入密码(根据实际需求设置密码)
3、 创建进程所需的相关目录并授权mysql用户(组)
#mkdir -p /data/mysql-8.0.17/mysql
#cd /data/mysql-8.0.17/mysql
#mkdir data tmp run log
#chown -R mysql:mysql /data/mysql-8.0.17/mysql
4 安装运行
本文将介绍mysql的两种安装方式:RPM安装、编译安装,请视具体情况选择其中一种安装方式
4.1 RPM安装
4.1.1 下载RPM安装包
1、下载MySQL的RPM安装包,并上传至服务器进行解压:
https://dev.mysql.com/downloads/mysql/
2、在服务器/home分区下新建mysql-rpm文件夹,并将下载的安装包上传至该目录:
# mkdir /home/mysql-rpm
3、执行tar xvf mysql-8.0.17-2.el7.aarch64.rpm-bundle.tar解压后得到rpm安装文件
4.1.2 安装rpm包
1、 卸载系统自带mariadb-libs,否则会导致无法安装mysql-community-libs
yum -y remove mariadb-libs
2、 安装依赖包
yum -y install net-tools
3、 执行以下命令,安装mysql:
rpm -ivh mysql-community-common-8.0.17-2.el7.aarch64.rpm
rpm -ivh mysql-community-libs-8.0.17-2.el7.aarch64.rpm
rpm -ivh mysql-community-client-8.0.17-2.el7.aarch64.rpm
rpm -ivh mysql-community-server-8.0.17-2.el7.aarch64.rpm
4.1.3 初始化数据
RPM包安装方式下,默认的数据目录(datadir)为/var/lib/mysql,通常需要更改为自定义的路径,这里我们更改为上文3.4章节创建的目录
1、 修改配置文件:
# vi /etc/my.cnf
[mysqld_safe]
log-error=/data/mysql-8.0.17/mysql/log/mysql.log
pid-file=/data/mysql-8.0.17/mysql/run/mysqld.pid
[mysqldump]
quick
[mysql]
no-auto-rehash
[client]
socket=/data/mysql-8.0.17/mysql/run/mysql.sock
default-character-set=utf8
[mysqld]
tmpdir=/data/mysql-8.0.17/mysql/tmp
datadir=/data/mysql-8.0.17/mysql/data
socket=/data/mysql-8.0.17/mysql/run/mysql.sock
port=3306
user=mysql
2、 初始化数据
# mysqld --defaults-file=/etc/my.cnf --initialize --datadir=/data/mysql-8.0.17/mysql/data --user=mysql
上图标记字符XKp6iwH&pYgh为初始登录密码,请注意保存。
4.1.4 启动mysql
# mysqld &
检查进程是否启动
4.1.5 登录数据库
使用默认密码登录(采用RPM包安装时,默认数据目录为/var/lib/mysql,默认密码保存在/var/log/mysqld.log)
mysql -u root -p
输入密码
4.1.6 配置数据库账号密码
>alter user 'root'@'localhost' identified by "123456";——修改本地root用户登录密码
>create user 'root'@'%' identified by '123456';——创建全域root用户(允许root从其他服务器访问)
>grant all privileges on *.* to 'root'@'%';——进行授权
>flush privileges;
4.1.7 退出数据库
执行\q退出数据库
4.1.8 卸载mysql
通过yum remove mysql-community-common.aarch64进行mysql和相关依赖的卸载:
yum list installed |grep mysql 查看卸载前后是否还存在mysql相关安装包。
4.2 编译安装
如果已完成4.1章节的RPM方式安装,请忽略此章节。
4.2.1 依赖包下载安装
I. 配置本地yum库
1、 执行命令备份原yum库文件并将新配置写入repo文件:
#mv /etc/yum.repos.d/ns7-adv.repo /etc/yum.repos.d/ns7-adv.repo.bak
#vi /etc/yum.repos.d/ns7-adv.repo
修改为本地镜像源(红色加粗字体部分)
[ns7-adv-os]
name=NeoKylin Linux Advanced Server 7 - Os
baseurl=file:///media/OS
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-neokylin-release
enabled=1
[ns7-adv-updates]
name=NeoKylin Linux Advanced Server 7 - Updates
baseurl=file:///media/OS
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-neokylin-release
enabled=1
2、 执行cat确认上一步操作写入成功,显示如下图
#cat /etc/yum.repos.d/ns7-adv.repo
II. 挂载OS镜像文件
需要在KVM挂载镜像或者上传OS镜像至系统,即执行1或者2。
1、 KVM挂载镜像,挂载镜像至/mnt/目录下
#mount /dev/sr0 /mnt/
2、 上传OS镜像至/home路径,挂载镜像至/mnt/目录下(iso文件名视具体情况修改)
#mount -o loop /home/CentOS-7-aarch64-Everything-1810.iso /media/OS
III. 执行以下命令安装所需依赖包
# yum install bison ncurses ncurses-devel libaio-devel openssl openssl-devel gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel gcc gcc-c++
IV. 升级cmake 至3.4.3或以上版本(本文以3.5.2版本为例)
下载链接:https://github.com/Kitware/CMake/releases/download/v3.5.2/cmake-3.5.2.tar.gz
将软件包上传至服务器中并解压得到cmake-3.5.2
cd cmake-3.5.2
./bootstrap
make
make install
V. 升级gcc版本至5.3或者以上(本文以7.3版本为例)
系统自带的gcc软件很老,需要重新安装。
gcc7.3.0下载
gcc7.3下载地址:
https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz
下载的gcc-7.3.0.tar.gz包如下:
将gcc-7.3.0.tar.gz放于/home目录下,将解压安装:
#cd /home
#tar -xvf gcc-7.3.0.tar.gz
gcc编译安装
1、编译
#cd /home/gcc-7.3.0
#./configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,lto --enable-plugin --enable-initfini-array --disable-libgcj
#make -j 96
其中96为CPU核数
#make install
2、查看版本升级成功
4.2.2 解决-fsigned-char问题
1.使用command -v gcc命令寻找gcc所在路径(一般位于/usr/bin/gcc)
2.更改gcc的名字(比如改成gcc-impl)
3.在gcc所在目录执行vim gcc,并填入如下内容保存(注意符号和字符要是英文半角):
#! /bin/sh /usr/bin/gcc-impl -fsigned-char "$@"
|
4.执行chmod +x gcc给脚本添加执行权限
5.使用与1-4步相似的方式给g++创建同名字的脚本文件
4.2.3 Mysql安装
I. 下载源码
下载MySQL源码包(includes Boost Headers),并上传至服务器:
https://downloads.MySQL.org/MySQL/8.0.17/
上传至服务器/home目录下,
执行tar -zxvf mysql-boost-8.0.17.tar.gz解压后得到mysql-8.0.17目录。
II. 编译安装
1、进入/home/mysql-8.0.17源码文件夹:
# cd /home/mysql-8.0.17
2、执行命令进行编译安装
cmake . -DCMAKE_INSTALL_PREFIX=/home/mysql-8.0.17/mysql -DMYSQL_DATADIR=/data/mysql-8.0.17/mysql -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_EMBEDDED_SERVER=1 -DCMAKE_C_COMPILER=/usr/bin/gcc -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/mysql-8.0.17/boost/boost_1_69_0 -DFORCE_INSOURCE_BUILD=1 |
在编译安装的时候,路径要根据实际情况而定,下表为对编译安装的关键路径的解释:
DCMAKE_INSTALL_PREFIX |
用于指定软件的安装路径。本次安装路径为:/home/mysql-8.0.17 |
DMYSQL_DATADIR |
创建数据库时,数据文件存放的路径。本次安装路径为:/data/mysql-8.0.17/mysql |
DCMAKE_C_COMPILER |
安装gcc的存放路径,如果在安装gcc没有指定路径的情况下,一般默认存放在/usr/local/bin目录下 |
DWITH_BOOST |
解压的mysql安装压缩包中boost_1_69_0文件夹所在路径。例如,本文解压在/home目录下,则路径为:/home/mysql-8.0.17/boost/boost_1_69_0 |
# make -j60
# make install
III. 修改配置文件
编辑my.cnf文件,其中文件路径(包括软件安装路径、数据日志存放路径等)根据实际情况修改。
vim /etc/my.cnf
[mysqld_safe]
log-error=/data/mysql-8.0.17/mysql/log/mysql.log
pid-file=/data/mysql-8.0.17/mysql/run/mysqld.pid
[mysqldump]
quick
[mysql]
no-auto-rehash
[client]
socket=/data/mysql-8.0.17/mysql/run/mysql.sock
[mysqld]
basedir=/home/mysql-8.0.17/mysql #(数据库软件安装的全路径)
tmpdir=/data/mysql-8.0.17/mysql/tmp
datadir=/data/mysql-8.0.17/mysql/data
socket=/data/mysql-8.0.17/mysql/run/mysql.sock
port=3306
user=mysql
[client]
socket=/data/mysql-8.0.17/mysql/run/mysql.sock
default-character-set=utf8
IV. 配置环境变量
编译安装完成后,将mysql二进制文件路径到PATH:
vim /etc/profile
在末尾添加export PATH=$PATH:/home/mysql-8.0.17/mysql/bin
其中PATH中的/home/mysql-8.0.17/mysql/bin路径,为mysql软件安装目录下的bin文件的绝对路径
[root@localhost ~]# source /etc/profile
4.2.4 运行
I. 初始化数据库
执行下面的命令初始化数据库后,回显中第3行中有初始密码,注意保存,后续章节会用到。
# /home/mysql-8.0.17/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize --basedir=/home/mysql-8.0.17/mysql --datadir=/data/mysql-8.0.17/mysql/data --user=mysql
II. 启动MySQL服务
chmod 777 /home/mysql-8.0.17/mysql/support-files/mysql.server
cp /home/mysql-8.0.17/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
III. 接入mysql环境。
mysql -uroot -p(密码为步骤I中的初始密码,请留意包括特殊字符)
IV. 配置数据库账号密码
>alter user 'root'@'localhost' identified by "123456";——修改本地root用户登录密码
>create user 'root'@'%' identified by '123456';——创建全域root用户(允许root从其他服务器访问)
>grant all privileges on *.* to 'root'@'%';——进行授权
>flush privileges;
V. 退出数据库
执行\q或者exit退出数据库
4.2.5 卸载mysql
1、 删除mysql的安装目录
2、 删除mysql配置启动项、环境变量等配置项即可。
5 备份数据库
5.1 创建数据库和表
5.1.1 基本命令
1、接入mysql数据库
mysql -u<用户名> –p<密码>
2、创建数据库
create database <数据库>;
3、创建表
use <数据库>
create table <表名> (<列名> <数据类型> );
5.1.2 举例
1、接入mysql数据库
mysql -uroot –p
2、创建数据库,名字为db1
create database db1;
3、创建表,名字为tb1
use db1
create table tb1(username varchar(20) not null);
5.2 备份数据库
5.2.1 基本命令
1、执行以下命令备份数据库
mysqldump -h <主机> -P <端口> -u <用户名> -p<密码> --database <数据库> > /路径/文件名.sql
2、执行以下命令恢复数据库
mysql -h <主机> -P <端口> -u <用户名> -p<密码> --<数据库> < /opt/mytest_bak.sql
5.2.2 举例
说明:下面命令中-h后的主机IP根据实际情况修改
1、全库备份
mysqldump -h 192.168.202.102 -P 3306 -uroot -p123456 --all-databases > alldb.sql
2、指定库备份
mysqldump -h 192.168.202.102 -P 3306 -uroot -p123456 --databases db1 > db1.sql
3、指定表备份
mysqldump -h 192.168.202.102 -P 3306 -uroot -p123456 db1 tb1 > db1tb1.sql
4、恢复数据库
mysql -h 192.168.202.102 -P 3306 -uroot -p123456 db1 < db1.sql
6 常见问题处理
6.1.1 cmake升级版本不生效的问题
问题描述:4.4章节执行后版本不生效。
问题原因:可能是原系统自带cmake未卸载造成的
解决方法:参考https://blog.csdn.net/jiang_xinxing/article/details/77945478
先通过yum移除原先的cmake,然后加软连接
6.1.2 cmake编译安装失败
问题描述:6.1章节执行cmake . -DCMAKE_INSTALL_PREFIX=/home/mysql-8.0.17/mysql -DMYSQL_DATADIR=/data/mysql-8.0.17/mysql -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DENABLE_DTRACE=0 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DWITH_EMBEDDED_SERVER=1 -DCMAKE_C_COMPILER=/usr/bin/gcc -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/mysql-8.0.17/boost/boost_1_69_0 -DFORCE_INSOURCE_BUILD=1
后报错如下
解决方法:把cmakecache.txt文件删了之后,重新执行
6.1.3 os0atomic.ic:194:2: 错误:#error "Unsupported platform"
问题描述:make时报错
/home/mysql-8.0.17/storage/innobase/include/os0atomic.ic:194:2: 错误:#error "Unsupported platform"
#error "Unsupported platform"
/home/mysql-8.0.17/storage/innobase/include/os0atomic.h:73:13: 警告:‘lock_word_t os_atomic_test_and_set(volatile lock_word_t*, lock_word_t)’ declared ‘static’ but never defined [-Wunused-function]
lock_word_t os_atomic_test_and_set(volatile lock_word_t *ptr,
^~~~~~~~~~~~~~~~~~~~~~
/home/mysql-8.0.17/storage/innobase/include/os0atomic.h:82:13: 警告:‘lock_word_t os_atomic_val_compare_and_swap(volatile lock_word_t*, lock_word_t, lock_word_t)’ declared ‘static’ but never defined [-Wunused-function]
lock_word_t os_atomic_val_compare_and_swap(volatile lock_word_t *ptr,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [storage/innobase/CMakeFiles/innodb_zipdecompress.dir/buf/buf.cc.o] 错误 1
make[2]: *** 正在等待未完成的任务....
Scanning dependencies of target component_mysql_server
解决方法:
修改os0atomic.h,修改第60行和64行,增加arm平台型号__aarch64__
vi /home/mysql-8.0.17/storage/innobase/include/os0atomic.h
#endif /* _WIN32 */
#if defined __i386__ || defined __x86_64__ || defined _M_IX86 || \
defined _M_X64 || defined __WIN_ || defined __aarch64__
#define IB_STRONG_MEMORY_MODEL
#endif /* __i386__ || __x86_64__ || _M_IX86 || _M_X64 || __WIN__ || __aarch64__ */
/** Atomic compare-and-swap and increment for InnoDB. */
参考链接:
1、https://bugs.mysql.com/bug.php?id=80907
2、https://blog.csdn.net/fhyocean/article/details/74960005
3、https://blog.csdn.net/changqing1990/article/details/83027384
6.1.4 virtual memory exhausted: 无法分配内存
问题描述:
virtual memory exhausted: 无法分配内存
make[2]: *** [sql/CMakeFiles/sql_main.dir/item_func.cc.o] 错误 1
make[2]: *** 正在等待未完成的任务....
virtual memory exhausted: 无法分配内存
make[2]: *** [sql/CMakeFiles/sql_main.dir/item_regexp_func.cc.o] 错误 1
^Cmake[2]: *** [sql/CMakeFiles/sql_main.dir/sql_yacc.cc.o] 中断
make[1]: *** [sql/CMakeFiles/sql_main.dir/all] 中断
make: *** [all] 中断
解决方法:
问题原因是由于在虚拟机上编译,虚拟机内存只有4G,增加虚拟机内存到16G之后编译通过。
6.1.5 buf0buf.cc: 在函数‘void buf_pool_create(buf_pool_t*, ulint, ulint, std::mutex*, dberr_t&)’中:/home/mysql-8.0.17/storage/innobase/buf/buf0buf.cc:1220:44: 错误:‘SYS_gettid’在此作用域中尚未声明setpriority(PRIO_PROCESS, (pid_t)syscall(SYS_gettid), -20)
问题描述:
[ 95%] Building CXX object storage/innobase/CMakeFiles/innobase.dir/buf/buf0rea.cc.o
[ 95%] Building CXX object storage/innobase/CMakeFiles/innobase.dir/clone/clone0api.cc.o
/home/mysql-8.0.17/storage/innobase/buf/buf0buf.cc: 在函数‘void buf_pool_create(buf_pool_t*, ulint, ulint, std::mutex*, dberr_t&)’中:
/home/mysql-8.0.17/storage/innobase/buf/buf0buf.cc:1220:44: 错误:‘SYS_gettid’在此作用域中尚未声明
setpriority(PRIO_PROCESS, (pid_t)syscall(SYS_gettid), -20);
^~~~~~~~~~
/home/mysql-8.0.17/storage/innobase/buf/buf0buf.cc:1220:44: 附注:suggested alternative: ‘my_getwd’
setpriority(PRIO_PROCESS, (pid_t)syscall(SYS_gettid), -20);
^~~~~~~~~~
my_getwd
make[2]: *** [storage/innobase/CMakeFiles/innobase.dir/buf/buf0buf.cc.o] 错误 1
make[2]: *** 正在等待未完成的任务....
make[1]: *** [storage/innobase/CMakeFiles/innobase.dir/all] 错误 2
make: *** [all] 错误 2
解决方法:
由于gcc动态链接库错误,需要将安装的gcc7.3.0动态链接库加入环境变量中。
vi /etc/profile 添加以下语句
export LD_LIBRARY_PATH=$GCC_HOME/lib64:$GCC_HMOE/lib:$LD_LIBRARY_PATH
source /etc/profile 使环境变量生效
参考链接:https://blog.csdn.net/pzqingchong/article/details/78739595
6.1.6 mysqld_safe error: log-error set to '/data/mysql-8.0.17/mysql/log/mysql.log', however file don't exists
问题描述:
[root@localhost mysql]# service mysql start
Starting MySQL.2019-09-04T09:05:18.483011Z mysqld_safe error: log-error set to '/data/mysql-8.0.17/mysql/log/mysql.log', however file don't exists. Create writable for user 'mysql'.
ERROR! The server quit without updating PID file (/data/mysql-8.0.17/mysql/data/localhost.localdomain.pid).
解决方法:
在log目录下新增mysql.log文件并保存
[root@localhost mysql]# cd /data/mysql-8.0.17/mysql/log/
[root@localhost log]# vi mysql.log
6.1.7 ERROR! The server quit without updating PID file (/data/mysql-8.0.17/mysql/data/localhost.localdomain.pid)
问题描述:
[root@localhost log]# service mysql start
Starting MySQL. ERROR! The server quit without updating PID file (/data/mysql-8.0.17/mysql/data/localhost.localdomain.pid).
[root@localhost log]# cd /data/mysql-8.0.17/mysql/data/
[root@localhost data]# ls
auto.cnf binlog.index client-cert.pem ibdata1 ibtmp1 mysql private_key.pem server-key.pem undo_002
binlog.000001 ca-key.pem client-key.pem ib_logfile0 #innodb_temp mysql.ibd public_key.pem sys
binlog.000002 ca.pem ib_buffer_pool ib_logfile1 localhost.pid performance_schema server-cert.pem undo_001
解决方法:
给mysql用户赋予对应目录data/mysql-8.0.17目录使用权限
chown -R mysql:mysql /data/mysql-8.0.17