一、下载源码 这里官网给出了两种版本,一个是带boost一个是不带的,这次先尝试编译带boost库的mysql
Mysql官网下载地址
Product Version: 8.0.24
Operating System: Source Code
OS Version: Generic linux (Architecture Independent)
选择:Compressed TAR Archive, Includes Boost Headers
二、删除旧数据库 1. 删除自带mysql 使用以下命令查找出安装的mysql软件包和依赖包:apt -list | grep mysql
如果有的话,可能的显示结果和操作方法如下
1 2 3 4 5 6 7 8 mysql80-community-release-el7-1 .noarch mysql-community-server-8 .0 .11-1 .el7 .x86_64 mysql-community-common-8 .0 .11-1 .el7 .x86_64 mysql-community-libs-8 .0 .11-1 .el7 .x86_64 mysql-community-client-8 .0 .11-1 .el7 .x86_64 #使用以下命令依次删除上面的程序 apt remove mysql-xxx-xxx-
删除mysql的配置文件,卸载不会自动删除配置文件,首先使用如下命令查找出所用的配置文件:find / -name mysql
如果有的话,可能的显示结果和操作方法如下:
1 2 3 4 5 6 7 8 /etc/logrotate.d/mysql /etc/selinux/targeted/active/modules/100 /mysql /etc/selinux/targeted/tmp/modules/100 /mysql /var/lib /mysql /var/lib /mysql /mysql /usr/bin/mysql /usr/lib64/mysql /usr/local/mysql
使用rm - rf
删除所有的
1 rm -rf /var/lib/mysql .... .... .... ....
或者尝试管道符
1 find / -name mysql | rm - rf
2. 删除自带MariaDB 由于MySQL在CentOS7中收费了,所以已经不支持MySQL了,取而代之在CentOS7内部集成了mariadb,而安装MySQL的话会和MariaDB的文件冲突,所以一定需要先卸载掉MariaDB .
使用rpm
命令查找出要删除的mariadb文件:
1 2 3 4 apt -list | grep mariadb #可能的显示结果如下: #mariadb-libs-5.5 .56 -2. el7.x86_64 apt -e mariadb-libs-5.5 .56 -2. el7.x86_64 #删除上面的程序
三、安装及其他需要软件 龙芯平台上cmake和gcc不需要变动,如果是windows的虚拟机要安装高版本mysql才需要变。
1、cmake 先卸载之前的低版本的cmake
编译安装cmake
1.1、解压cmake并进入目录 1 2 3 tar zxf cmake-3 .15 .0-rc1 .tar .gz cd cmake-3 .15 .0-rc
1.2、配置、编译、安装 1 2 3 4 5 6 7 ./configure --prefix=/usr/local /cmake make make install#--prefix 参数是配置cmake的安装目录
1.3、做cmake命令软连接,查看cmake版本 1 2 ln -s /usr/ local/cmake/ bin/cmake /u sr/bin/ cmake cmake --version
2、重新安装gcc高版本 2.1、下载源码包 1 2 cd /usr/local/src wget http: //ftp.tsukuba.wide.ad.jp/software /gcc/releases /gcc-8.3.0/gcc -8.3 .0 .tar.gz
2.2、进入gcc目录,安装gcc依赖库 1 2 3 4 cd gcc./contrib/download_prerequisites ../configure --prefix=/usr/local/gcc-8 .3.0 --enable-languages=c ,c++ --disable-multilib
开始使用apt
来按照
通过安装devtoolset来提升版本
使用 sudo apt install centos-release-scl
来安装centos-release-scl
安装devtoolset:sudo apt install devtoolset-8-gcc
激活安装的devtoolset: scl enable devtoolset-8 bash
然后用gcc -v
检查一下gcc的版本
注意:这种方式安装后每次重启gcc的版本可能会变成原来低版本的。重新输入激活安装的语句,再次检查gcc版本就好。或者可以将bin目录下的gcc换成高版本的。
3、配置、编译、安装 在mysql的安装目录下建立一个bld目录
1 2 3 4 mkdir bld #进入bld目录 cd bld #然后执行以下命令
cmake:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cmake -DCMAKE_INSTALL_PREFIX =/usr/local/mysql \ 安装根目录-DMYSQL_DATADIR =/data/3306/data \ 数据存储目录-DSYSCONFDIR =/data/3306 \ 配置文件(my.cnf)目录 (貌似没用,配置文件依然在/etc/my.cnf)-DWITH_MYISAM_STORAGE_ENGINE =1 \ 编译myisam存储引擎,默认的存储引擎,不加也可以-DWITH_INNOBASE_STORAGE_ENGINE =1 \ 支持InnoDB存储引擎,这个也是默认安装的-DWITH_MEMORY_STORAGE_ENGINE =1 \ 支持MEMORY引擎-DWITH_READLINE =1 \ 使用readline功能-DMYSQL_UNIX_ADDR =/data/3306/mysql.sock \ sock存放到/data/3306目录-DMYSQL_TCP_PORT =3306 \ 数据库端口-DENABLED_LOCAL_INFILE =1 \ 可以使用load data infile命令从本地导入文件-DWITH_PARTITION_STORAGE_ENGINE =1 \ 安装数据库分区-DEXTRA_CHARSETS =all \ 支持所有字符集-DDEFAULT_CHARSET =utf8 \ 默认字符集-DDEFAULT_COLLATION =utf8_general_ci \ 设置默认效验字符集排序规则,要和DDEFAULT_CHARSET一起用-DWITH_BOOST =boost 从MySQL 5.7.5开始Boost库是必需的然后就是make和make install
以下是我的输入
1 2 3 4 5 6 7 8 9 10 cmake .. / -DCMAKE_INSTALL_PREFIX =/usr/local/mysql \ -DDEFAULT_CHARSET =utf8 \-DDEFAULT_COLLATION =utf8_general_ci \-DSYSCONFDIR =/etc \-DWITH_EXTRA_CHARSETS =all \-DMYSQL_DATADIR =/usr/local/mysql/data \-DWITH_BOOST =/usr/local/src/mysql-8.0.24/boost \-DFORCE_INSOURCE_BUILD =0 \-DCMAKE_CXX_COMPILER =/usr/bin/g++ \-DDEFAULT_CHARSET =utf8
注意:cmake这步特别重要,需要着重看DWITH_BOOST=自己mysql源码下的boost目录(第一个就行)
DCMAKE_CXX_COMPILER=这个填写自己的g++目录。可以使用whereis g++
。找到usr/bin/下面的。一定要测试一下这个g++是哪个版本的,如果编译mysql8必须是5以上的高版本。
然后(这步不需要网络)
1 2 3 make 或者make -j4 (开启四个进程去编译,但不要超过自己电脑的处理器数量,用上面查看CPU的命令)make install
4、报错误 错误解决方式请参照解决方案。
1)、does not appear to contain CMakeLists.txt.
1 2 3 Make Warning: No source or binary directory provided. Both will be assumed to be the same as the current working directory^ but note that this warning will become a fatal error in future CMake releases.CMake Error: The source directory n/usr/local/src/mysql-8.0.24 does not appear to contain CMakeLists.txt. Specify 一一help for usagez or press the help button on the CMake GUI.
原因 :mysql下载的源码包不对
解决方法 :下载正确的mysql源码包。
2)、配置报错:Please install the appropriate openssl developer package.
1 2 3 4 5 6 7 8 9 10 11 Cannot find appropriate system libraries for WITH_SSL=system. Make sure you have specified a supported SSL version. Valid options are : system (use the OS openssl library ), yes (synonym for system ), </path /to /custom/openssl/installation〉, wolfssl (use wolfSSL. See extra/README-wolfssl. txt on how to set this up) CMake Error at cmake/ssl. cmake:68 (MESSAGE): Please install the appropriate openssl developer package. Call Stack (most recent call first ):cmake/ssl. cmake:413 (FATAL_SSL_NOT_FOUND_ERROR) CMakeLists. txt: 1002 (NfYSQL_CHECK_SSL)
解决方法 :安装openssl-devel
1 apt -y install openssl-devel
3)、配置报错:Could NOT find Curses
1 2 —Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH) CMake Error at cmake/readline. cmake:71 (MESSAGE): Curses library not found. Please install appropriate package,
解决方法 :安装ncurses-devel
1 apt -y install ncurses-devel
4)、编译报错:Please do not build in-source. Out-of source builds are highly
1 2 3 4 5 Cl-fake Error at Cl-fakeLists . txt: 301 (MESSAGE): Please do not build in -source. Out -of source builds are highly recontended: you can have multiple builds for the same source , and there is an easy way to do cleanup , simply remove the build directory (note that 'make clean' or 'make distclean' does *not * work ) You *can* force in -source build by invoking cmake with - DFORCE_INSOURCE_BUILD=1 —— Configuring incompletez errors occurred! See also r,/usr/local /src/mysql-8.0 .24 /C14akeFiles/C14akeOutput. logr,.
原因 :是它建议你不要构建源代码。
解决办法 :在配置的时候加入字段:-DFORCE_INSOURCE_BUILD=1
5)、配置报错:The C compiler identification is unknown
1 2 3 4 5 6 7 8 - Running cmake version 3.15 .0 -rcl —MySQL 8. 0. 24 CMake Error at CMakeLists. txt:271 (PROJECT): The CN!AKE_C_COMPILER: /usr/bin/cc is not a full path to an existing compiler tool. Tell CMake where to find the compiler by setting either the environment variable "CC" or the CMake cache entry CN!AKE_C_COMPILER to the full path to the compiler, or to the compiler name if it is in the PATH.
解决办法 :做一个gcc的软链接。
1 ln -s /usr/ local/gcc/ bin/gcc /u sr/bin/ cc
6)、编译报错:/usr/lib/libstdc++.so.6: version `CXXABI_1.3.9’ not found
1 2 3 4 5 ../runtime_output_directory/uca9dump: /lib64/libstdc++. so .6 : version found (required by .. /runtime_output_directory/uca9dump) make [2 ]: *** [strings/uca900_zh_tbls. cc ]错误 1 make [l ]: *** [strings/CMakeFiles/strings. dir/all ]错误 2 make : *** [all ]错误 2 CXXABI_1.3 . 91 not
因为libstdc++.so.6的库是使用的以前的老库。
解决办法 :修改软链接
1 2 3 find / -name libstdc++.so .6 mv /usr/lib64/libstdc++.so .6 /usr/lib64/libstdc++.so .6 _old ln -s /usr/local/gcc/lib64/libstdc++.so .6.0 .25 /usr/lib64/libstdc++.so .6
7)、编译报错:’SYS_gettid’ has not been declared in this scope
1 2 3 4 5 6 7 8 9 /usr/ local/src/ mysql-8. 0. 24 /storage/ innobase/buf/ bufObuf. cc:在函数 void buf_jpool_create (buf_pool_t*, ulint, ulint, std::mutex*, dberr_t&)中:/usr/ local/src/ mysql-8. 0. 24 /storage/ innobase/buf/ bufObuf. cc:1220 :44 :错误 SYS_gettid在此作用域中尚未声明 setpriority(PRI0_PR0CESS, (pid_t) syscall(SYS_gettid), -20 ); /usr/ local/src/ mysql-8. 0. 24 /storage/ innobase/buf/ bufObuf. cc:1220 :44 :附注:suggested alt ernative: my_getwdsetpriority(PRI0_PR0CESS, (pid_t)syscall(SYS_gettid), -20 ); make[2 ]: *** [storage/innobase/ CMakeFiles/innobase. dir/ buf/bufObuf.cc.o]错误 1 make[l]: *** [storage/innobase/ CMakeFiles/innobase. dir/ all]错误 2 make: *** [all]错误 2
解决方法 :在该文件上添加一个头文件。
1 2 3 vim /usr/ local/src/ mysql-8.0 .24 /storage/ innobase/buf/ buf0buf.cc #在第一行添加 #include "sys/syscall.h"
8)、编译报错:‘os_compare_and_swap_thread_id’ Has not been declared in this scope
1 2 3 4 5 6 7 [38% ] 'Li Idin;. XX oL.ieci: sro.' je/irir_C'ise/C-:yc.keFiles/iririobase. dii/l' jC-.k/l'jC-.kOl' jC-.k 二二 o /usr/local/src/mysql-8. 0. 24 /storage/innobase/lock /lock01ock. cc:在成 员函数 void RecLock: :mark_trx_for_rol Iback (trx_t* )'中: /usr/local/src/mysql-8. 0. 24/storage/innobase/lock /lock01ock.cc:1571:68:错 误: os_compar e_eind_swap_thread_i d,在此作用域中尚未声明 cas = os_compare_and_swap_thread_id(&trx->killed_by, 0 , thread_id);make [2 ]: *** [storage/innobase/CMakeFiles/innobase. dir/lock /lockOlock. cc. o]错误 1 make[l]: *** [storage/innobase/CMakeFiles/innobase. dir/all]错误 2 make: *** [all]错误 2
解决办法 :修改报错文件内容
1 2 3 vim /usr/ local/src/my sql-8.0 .24 /storage/i nnobase/lock/ lock0lock.cc os_compare_and_swap_lint
9)、编译报错:/usr/bin/ar: ../../archive_output_directory/libz.a
1 2 3 4 /usr/bin/ar : . . . /archive_output_directory/libz. a :没有那个文件或目录 make [2 ]: *** [archive_output_directory/libz. a ]错误 1 make [l ]: *** [extra/zlib/CMakeFiles/zlib. dir/all ]错误 2 make : *** [all ]错误 2
解决方法 :重新配置编译
1 2 3 make clean cmake .....(你的配置参数)make
10)、编译报错:_DIAGASSERT、libedit_fgetln、__arraycount、libedit_fgetln an undefined reference
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [89 %] Linking CXX executable .. /runtime_output_directory/mysql /usr/local/src/mysql-8. 0. 24 /extra/libedit/np/vis. c:372 :错 误 /usr/local/src/mysql-8. 0. 24 /extra/libedit/np/vis. c:373 :错 误 /usr/local/src/mysql-8. 0. 24 /extra/libedit/np/vis. c:374 :错 误 /usr/local/src/mysql-8. 0. 24 /extra/libedit/np/vis. c:475 :错 误 /usr/local/src/mysql-8. 0. 24 /extra/libedit/el. c:554 :错误:对 :对 ,DIAGASSERT,未定义的引用 :对 ,DIAGASSERT,未定义的引用 :对 ,DIAGASSERT,未定义的引用 :对 ,DIAGASSERT,未定义的引用 〕ibedit_fgetln’未定义的引用 /usr/local/src/niysql-8. 0. 24 /extra/libedit/./history, c: 747 :错误:对〕ibedit_fgetln’未定义的引用 /usr/local/src/niysql-8. 0. 24 /extra/libedit/./history, c: 756 :错误:对〕ibedit_fgetln’未定义的引用 /usr/local/src/mysql-8. 0. 24 /extra/libedit/np/unvis. c:451 :错误:对 '—arraycount'未定义的引用 /usr/local/src/mysql-8. 0. 24 /extra/libedit/np/unvis. c:458 :错误:对 '—arraycount'未定义的引用 /usr/local/src/niysql-8. 0. 24 /extra/libedit/history. c: 747 :错误:对〕ibedit_fgetln’未定义的引用 collect2:错误:Id 返回 1 make[2 ]: *** [runtime_output_directory/mysql]错误 1 make[l]: *** [client/CMakeFiles/mysql. dir/all]错误 2 make: *** [all]错误 2
解决方法 :在各文件里加入sys.h头文件
1 2 #在文件中加入 #include <sys.h>
5、数据库用户 1 useradd -s /sbin/ nologin mysql
6、创建数据存放目录并修改权限 1 2 mkdir /usr/ local/mysql/ data chown -R mysql: mysql /usr/ local/mysql
7、修改配置文件(根据自己的情况来配置) 这里我找不到自己的配置文件在哪
从Oracle官方了解到:mysql5.7.18 开始不在二进制包中提供 my-default.cnf 文件。
修改配置文件的目的是为了下一步初始化的操作,我们可以在下一步通过命令行来实现(也就是说可以跳过这部)。
但对于更低版本的有如下方式寻找
1 2 3 4 which mysqld/usr/local /mysql/bin/mysqld --verbose --help |grep -A 1 'Default options'
然后使用vim修改配置文件
1 2 3 4 5 6 7 8 9 [mysqld] port =3306 server-id =1 basedir =/usr/local/mysqldatadir =/usr/local/mysql/datasocket =/usr/local/mysql/mysql.sock[client] socket =/usr/local/mysql/mysql.sock
初始化配置文件详解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/mysql datadir = /data/mysql pid-file = /data/mysql/mysql.pid user = mysql bind-address = 0.0.0.0 server-id = 1 skip-name-resolve back_log = 600 max_connections = 1000 max_connect_errors = 6000 open_files_limit = 65535 table_open_cache = 128 max_allowed_packet = 4M binlog_cache_size = 1M max_heap_table_size = 8M tmp_table_size = 16M read_buffer_size = 2M read_rnd_buffer_size = 8M sort_buffer_size = 8M join_buffer_size = 8M thread_cache_size = 8 query_cache_size = 8M query_cache_limit = 2M key_buffer_size = 4M ft_min_word_len = 4 transaction_isolation = REPEATABLE-READ log_bin = mysql-bin binlog_format = mixed expire_logs_days = 30 log_error = /data/mysql/mysql-error.log slow_query_log = 1 long_query_time = 1 slow_query_log_file = /data/mysql/mysql-slow.log performance_schema = 0 explicit_defaults_for_timestamp skip-external-locking default-storage-engine = InnoDB innodb_file_per_table = 1 innodb_open_files = 500 innodb_buffer_pool_size = 64M innodb_write_io_threads = 4 innodb_read_io_threads = 4 innodb_thread_concurrency = 0 innodb_purge_threads = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 32M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 bulk_insert_buffer_size = 8M myisam_sort_buffer_size = 8M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 interactive_timeout = 28800 wait_timeout = 28800 [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M
我的这步出错了。socket后面写成mysql的可执行文件了,直接导致mysql可执行文件不能使用。第二章图看到mysql可执行文件变为紫色
这步查找了为什么mysql可执行文件不能使用
1.设置到系统路径下
2.在本目录下使用./
3.确认命令格式是否正确
4.查找命令权限。ls -al
和file(file是查找文件类型的)
在编译每一步完成后最好都加上快照。实验得出,在挂起状态下快照,占用空间更少。
重新make
(这步速度快的话大概一小时左右),然后继续配置
接着make install
(这步速度很快,几分钟就好 )
8、初始化数据库并安装ssl 如果上一步配置了配置文件的话,这里使用这个命令
1 2 /usr/ local/mysql/ bin/mysqld --initialize --user=mysql --datadir=/usr/ local/mysql/ data/usr/ local/mysql/ bin/mysql_ssl_rsa_setup
9、复制启动脚本、启动 1 2 cp /usr/ local/mysql/ support-files/mysql.server / etc/init.d/my sqld /etc/i nit.d/mysqld start
设置开机自启
先将/usr/local/mysql/mysql/support-files/ 文件夹下的mysql.server文件复制到 /etc/rc.d/init.d/ 目录下mysqld
1 2 3 4 5 6 7 cp /usr/ local/mysql/ mysql/support-files/ mysql.server /etc/ rc.d/init.d/mysqld #赋予可执行权限: chmod +x /etc/ init.d/mysqld #添加为服务: chkconfig --add mysqld #查看服务列表: chkconfig --list
看到3、4、5状态为开或者为 on 则表示成功。如果是 关或者 off 则执行一下:chkconfig --level 345 mysqld on
再次查看服务列表或者查看3306端口号
启动成功!!
10、修改mysql密码(忘记密码) 登录mysql后直接执行更改命令,如果不行的话执行后面的
1 2 3 4 export PATH=$PATH :/usr/local/MySQL/bin 就OK alter user 'root' @'locahost' identified by 'admin123‘;
10.1 在配置文件中的[mysqld]下加入skip-grant-tables(在[mysqld]范围内任意行加入都可以) 1 2 3 vim /etc/my.cnf [mysqld] skip-grant -tables
10.2 重启mysql 1 /etc/i nit.d/mysqld restart
10.3 登录数据库后,修改密码为空。 1 2 3 4 5 6 mysql mysql >use mysql; mysql >update user set authentication_string ="" where user ='root' ; mysql >flush privileges; mysql > exit;
10.4 在配置文件中删除skip-grant-tables并重启mysql 1 /etc/i nit.d/mysqld restart
10.5 登录mysql,修改密码 1 2 3 4 mysql -uroot -ppassword mysql>alter user 'root '@' locahost' identified by 'admin123 ‘; mysql>flush privileges; mysql>exit ;
这里修改密码出现了问题,尝试了好几种修改密码的语句。最后问题出在mysql8的密码政策改变了,密码必须满足
### 密码必须包含两个大写字母 、特殊符号、 字母、 数字
特殊字符可以是@
1 ALTER USER 'root' @'localhost' IDENTIFIED WITH mysql_native_password BY 'RootPwd@123456' ;