• Armbian OS(基于ubuntu24) 源码编译mysql 5.7


    最近弄了个S905X3的盒子刷完Armbian OS (基于ubuntu24),开始折腾Arm64之旅。第一站就遇到了MySQL的问题,由于MySQL没有提供Arm64版本,又不想塞Docker镜像,因此选择源码来编译MySQL5.7。下面记录详细过程和遇到的一些问题

    CMAKE

    最新的mysql均采用cmake的环境,因此要编译从cmake开始。Armbian OS默认安装的都是精简系统,得自行安装一下cmake

    apt install cmake

    至于BuildEssiontial,貌似默认就带了,于是继续往下走

    万年的MySQL57,万年的OPENSSL1.1

    要装MySQL,一个蛋疼的组件就是OPENSSL,众所周知从ubuntu22开始,openssl 1.1版就已经没有在默认库带上了。其它系统上还可以通过强制指定库来处理,Arm系统下,只得自己下来源码编译

    wget https://mirrors.tencent.com/openssl/source/old/1.1.1/openssl-1.1.1v.tar.gz

    然后展开后一路make && make install就好了

    下载MYSQL57源码

    下载最新带boost的源码包

    https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.44.tar.gz

    下来后然后展开

    tar -xvf mysql-boost-5.7.44.tar.gz

    然后把依赖更新一下,对于ubuntu24来说,是这几个

    1. apt-get install libncurses-dev
    2. apt install pkg-config
    3. apt install libtirpc-dev

    补丁&开始编译

    源码展开后,要补丁一下,否则mysql client工具会报segmentation fault错误无法使用:

    在源码解压文件中,找到terminal.h源码文件并编辑

    find / -name "terminal.h" -print | head -n 1 | xargs vi

    将其中的ifdef __sun 段注释掉完全开放
    修改后是这样

    1. /* #ifdef __sun */
    2. extern int tgetent(char *, const char *);
    3. extern int tgetflag(char *);
    4. extern int tgetnum(char *);
    5. extern int tputs(const char *, int, int (*)(int));
    6. extern char* tgoto(const char*, int, int);
    7. extern char* tgetstr(char*, char**);
    8. /* #endif */

    然后就可以开始编译了,进入mysql展开的目录(我的是展开到了/opt/setups/mysql/mysql-5.7.44),执行以下代码先开启4核(我的HK1BOX是4核ARM):

    export MAKEFLAGS=-j4

    进入到展开的源码目录执行,然后下面是编译命令:

    cmake . -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=/opt/setups/mysql/mysql-5.7.44/boost/

    最好加个nohup后台执行,因为太。。。。漫长了。

    在我的小盒子里开4个线程,7W的满载功率,跑了1个小时才编译完,这还是开4线程跑的

    幸好改装了风扇压住了温度,最高保持在50度(室温25)

    配置MYSQL

    建立一个MYSQL用户,然后把目标目录授权给该用户

    1. groupadd mysql
    2. useradd mysql -s /sbin/nologin -M -g mysql
    3. chown -R mysql:mysql /usr/local/mysql

    把mysql加入到路径,这样后面执行命令就方便了

    1. echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    2. source /etc/profile

    优化一下配置,对于我们这种小盒子系统,资源占用越小越好

    vi /etc/my.cnf

    1. # For advice on how to change settings please see
    2. # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    3. [mysqld]
    4. #
    5. # Remove leading # and set to the amount of RAM for the most important data
    6. # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    7. # innodb_buffer_pool_size = 128M
    8. #
    9. # Remove leading # to turn on a very important data integrity option: logging
    10. # changes to the binary log between backups.
    11. # log_bin
    12. #
    13. # Remove leading # to set options mainly useful for reporting servers.
    14. # The server defaults are faster for transactions and fast SELECTs.
    15. # Adjust sizes as needed, experiment to find the optimal values.
    16. # join_buffer_size = 128M
    17. # sort_buffer_size = 2M
    18. # read_rnd_buffer_size = 2M
    19. datadir=/opt/mysql/data
    20. socket=/opt/mysql/mysql.sock
    21. # Disabling symbolic-links is recommended to prevent assorted security risks
    22. symbolic-links=0
    23. log-error=/opt/mysql/mysqld.log
    24. pid-file=/opt/mysql/mysqld.pid
    25. #密码检查规则关闭
    26. #validate_password=off
    27. max_allowed_packet = 16M
    28. skip-character-set-client-handshake
    29. default-storage-engine=INNODB
    30. character_set_server=utf8mb4
    31. collation-server=utf8mb4_unicode_ci
    32. init-connect='SET NAMES utf8mb4'
    33. lower_case_table_names=1
    34. max_connections=1000
    35. server-id=1
    36. log-bin=mysql-bin
    37. expire_logs_days=7
    38. performance_schema_max_table_instances=200
    39. table_definition_cache=200
    40. table_open_cache=128

    然后按配置的初始化一下目录和权限

    1. mkdir -p /opt/mysql/data
    2. chown -R mysql:mysql /opt/mysql/

    执行初始化

    mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql

    然后查看root默认密码:

    cat /opt/mysql/mysqld.log | grep "temporary password"

    写个启动服务

    vi /etc/systemd/system/mysqld.service

    内容如下:

    1. [Unit]
    2. Description=MySQL Server Daemon
    3. After=network.target
    4. [Service]
    5. User=mysql
    6. Group=mysql
    7. Type=forking
    8. PIDFile=/opt/mysql/mysqld.pid
    9. ExecStart=/usr/local/mysql/bin/mysqld --daemonize
    10. ExecReload=/bin/kill -s HUP $MAINPID
    11. TimeoutStartSec=120
    12. TimeoutStopSec=10
    13. KillMode=process
    14. Restart=on-failure
    15. LimitNOFILE=5000
    16. [Install]
    17. WantedBy=multi-user.target

    然后设置自启动:

    systemctl enable mysqld

    前面都正确的话,应该本地就可以用root+初始密码进入了

    mysql -uroot -p"Mu>aiR,Zx502" mysql

    然后修改下默认密码,例如:

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'admin'

    重启mysqld服务,完事

  • 相关阅读:
    odoo+物联网
    微信小程序中 在xwml 中使用外部引入的 js进行判断计算
    grafana 监控无图解决
    德人合科技|天锐绿盾加密软件——数据防泄漏系统
    flexsim仿真模型-MC公司下游仓库管理仿真实验
    一起Talk Android吧(第四百零二回:如何使用GridLayout布局)
    Spring-05 AOP入门( 原理解析)
    解决tomcat时区错误问题
    【多人在线游戏架构实战-基于C++的分布式游戏编程】开篇
    【Vue】的基础入门与生命周期----详细简介
  • 原文地址:https://blog.csdn.net/applebomb/article/details/139605792