[数据库] Kunpeng 920数据库MySQL 8.0.17移植指导书 for NeoKylinV7Update6 ★★★

本文主要提供在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 修改SELINUXdisabledNeoKylinV7U6默认是disabled

执行:#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

 

image.png

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

image.png

 

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、下载MySQLRPM安装包,并上传至服务器进行解压:

https://dev.mysql.com/downloads/mysql/  

image.png

 

              2、在服务器/home分区下新建mysql-rpm文件夹,并将下载的安装包上传至该目录:

                     # mkdir /home/mysql-rpm

              3、执行tar xvf mysql-8.0.17-2.el7.aarch64.rpm-bundle.tar解压后得到rpm安装文件

              image.png

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

image.png

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

image.png

 

上图标记字符XKp6iwH&pYgh为初始登录密码,请注意保存。

4.1.4 启动mysql

# mysqld &

检查进程是否启动

image.png

4.1.5 登录数据库

使用默认密码登录(采用RPM包安装时,默认数据目录为/var/lib/mysql,默认密码保存在/var/log/mysqld.log

mysql -u root -p

输入密码

image.png

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退出数据库

image.png



4.1.8 卸载mysql

      通过yum remove mysql-community-common.aarch64进行mysql和相关依赖的卸载:

  yum list installed |grep mysql 查看卸载前后是否还存在mysql相关安装包。

image.png

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

image.png

 

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

image.png

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


image.png

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

其中96CPU核数

image.png

#make install

2、查看版本升级成功

image.png

 

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/

image.png

 

       上传至服务器/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

image.png

# make -j60

image.png

# make install

image.png

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

image.png

其中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

image.png

 

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中的初始密码,请留意包括特殊字符)

image.png

IV. 配置数据库账号密码

>alter user 'root'@'localhost' identified by "123456";——修改本地root用户登录密码

image.png

>create user 'root'@'%' identified by '123456';——创建全域root用户(允许root从其他服务器访问)

>grant all privileges on *.* to 'root'@'%';——进行授权

>flush privileges;

image.png

 

V. 退出数据库

        执行\q或者exit退出数据库

image.png

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,然后加软连接

image.png

 

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

后报错如下

image.png

 

解决方法:cmakecache.txt文件删了之后,重新执行

image.png

 

  

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__



image.png


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