百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

【筑基篇】部署二进制MySQL(mysql存储二进制数据)

nanshan 2025-07-01 22:13 5 浏览 0 评论

手动部署二进制MySQL

刚拜入宗门修仙的各位,对于刚拿到的秘籍(官方文档)尚处于晦涩状态,下篇旨在将修炼入门功法的一些注意事项罗列而出,可实际直接照着修炼,少走弯路。

安装准备

关闭防火墙及selinux

数据库服务器通常运行在内部网络,因此可以视情况关闭防火墙及selinux设置。

1.关闭防火墙服务

systemctl stop firewalld
systemctl disable firewalld

2.关闭selinux

setenforce 0
sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config

设置 swap

建议配置足够的物理内存。如果内存不足,不建议使用 swap 作为缓冲,因为这会降低性能。这边设置了一个低值没有直接禁掉,也可设置直接为 0.

echo "vm.swappiness = 1">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p

操作系统优化

1.设置磁盘调度策略

# 查看当前设置,其中 nvme0n1 是磁盘对应的设备文件名称
lsblk -l
cat /sys/block/nvme0n1/queue/scheduler

# 如果不是 noop 或 deadline,则修改,改后立即生效,无需重启:
echo 'noop' > /sys/block/nvme0n1/queue/scheduler

2.确认CPU性能模式

# 检查当前模式
$ cpupower frequency-info --policy
analyzing CPU 0:
  Unable to determine current policy

注意

如果输出内容不是 The governor "performance" 而是 The governor "powersave" 的话,则要注意了。

The governor "powersave" 表示 cpufreq 的节能策略使用 powersave,需要调整为 performance 策略。

如果是虚拟机或者云主机,则不需要调整,命令输出通常为 Unable to determine current policy。

3.关闭透明大页

建议关闭透明大页(Transparent Huge Pages / THP)。OLTP型数据库内存访问模式通常是稀疏的而非连续的。当高阶内存碎片化比较严重时,分配 THP 页面会出现较高的延迟,反而影响性能。

# 查看当前设置
cat /sys/kernel/mm/transparent_hugepage/enabled

# 如果输出结果不是 never 的话,则需要执行下面的命令关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

4.优化内核参数

echo "fs.file-max = 1000000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 10" >> /etc/sysctl.conf
echo "net.ipv4.tcp_keepalive_time = 600" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_tw_buckets = 55000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.core.netdev_max_backlog = 200000" >> /etc/sysctl.conf
# 调整 TCP/UDP 套接字的接收和发送缓冲区大小
echo "net.core.rmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.wmem_default = 262144" >> /etc/sysctl.conf
echo "net.core.rmem_max = 2097152" >> /etc/sysctl.conf
echo "net.core.wmem_max = 2097152" >> /etc/sysctl.conf
echo "net.ipv4.tcp_synack_retries = 2" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
sysctl -p

5.修改使用资源上限

# 修改 /etc/security/limits.conf 系统文件
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
* soft nproc 65535
* hard nproc 65535

配置时间同步

需要配置好时间同步,时间同步一般采用 ntp 或 chrony,这边以chrony为例

yum install -y chrony

配置同步源,这边以配置阿里源为例,vim /etc/chrony.conf

pool ntp.aliyun.com iburst
pool ntp1.aliyun.com iburst
pool ntp2.aliyun.com iburst

配置完成后启动

systemctl start chronyd

部署安装

1. 下载二进制文件

下载地址:https://dev.mysql.com/downloads/mysql/注意看下系统glibc版本 getconf -a | grep glibc,可以向下兼容,不要选择高于当前版本

或者直接使用wget下载:

wget -c https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz

2.创建对应的存储路径

mkdir -p /data/mysql3306/data

3.创建组与用户

# 创建用户组与用户
groupadd mysql
useradd  -g mysql -s /bin/nologin mysql

# 给mysql数据文件路径授权
chown -R mysql:mysql /data/mysql3306

4.解压

tar xvf mysql-8.4.3-linux-glibc2.17-x86_64.tar.xz  -C /usr/local/
cd /usr/local

5.创建软链

ln -s mysql-8.4.3-linux-glibc2.28-x86_64/ mysql
ln -s /usr/lib64/libncurses.so.6.1 /usr/lib64/libncurses.so.5
ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5

如果so.5软件不创建的话登录时候会报错

mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

6.设置环境变量

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

7.设置my.cnf

简单设置下配置信息

[client]
port = 3308
socket  = /data/mysql3308/data/mysql.sock

[mysql]
prompt = "[\u@\p][\d]> "
no-auto-rehash

[mysqld]
# basic settings #
user = mysql
#主从复制或MGR集群中,server_id记得要不同
server_id = 217
basedir=/usr/local/mysql
datadir=/data/mysql3308/data
socket  = /data/mysql3308/data/mysql.sock
pid_file=/data/mysql3308/data/mysqld.pid
default_storage_engine = innodb
#default_authentication_plugin=mysql_native_password
#local_infile=1

mysqlx_port = 33080
mysqlx_socket=/data/mysql3309/data/mysqlx.sock

port = 3308
lower_case_table_names = 1
default_time_zone = "+8:00"
character_set_server=utf8mb4
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
open_files_limit = 65535
back_log = 1024
max_allowed_packet = 64M
event_scheduler = 0
#sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
#secure_file_priv = ''

admin_address = '127.0.0.1'
admin_port = 33082

# connection #
interactive_timeout = 1800
wait_timeout = 1800
lock_wait_timeout = 3600
skip_name_resolve = 1
max_connections = 1024
max_connect_errors = 1000000

# table cache performance settings
#table_open_cache = 4096
#table_definition_cache = 4096
#table_open_cache_instances = 16

# session memory settings #
read_buffer_size = 2M
read_rnd_buffer_size = 1M
sort_buffer_size = 2M
join_buffer_size = 2M
bulk_insert_buffer_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
thread_cache_size = 768
thread_stack = 512K

# log settings #
# 8.0参数
binlog_expire_logs_seconds = 604800
log_timestamps = SYSTEM
log_error = error.log
log_error_verbosity = 3
general_log_file = general.log
slow_query_log = 1
log_slow_extra = 1
slow_query_log_file = slow.log
long_query_time = 1
# log_queries_not_using_indexes = 1
log_slow_admin_statements = 1
# log_slow_slave_statements = 1
# log_slow_replica_statements  = 1
# log_throttle_queries_not_using_indexes = 10
# min_examined_row_limit = 100
log_bin = mysql-bin
binlog_cache_size = 2M
max_binlog_cache_size = 2G
max_binlog_size = 1G
binlog_rows_query_log_events = 1
log_bin_trust_function_creators = 1

# innodb settings #
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_data_file_path = ibdata1:100M:autoextend
#5.7默认16M,8.0默认128M
#innodb_log_buffer_size = 32M
# MySQL 8.0.30或更高版本推荐使用innodb_redo_log_capacity参数,innodb_log_files_in_group* innodb_log_file_size= innodb_redo_log_capacity
# 而 innodb_log_file_size 和 innodb_log_files_in_group 参数后续会被废弃
innodb_redo_log_capacity = 4G


innodb_max_undo_log_size = 4G
innodb_undo_log_truncate = 1
# 根据您的服务器IOPS能力适当调整
# 一般配普通SSD盘的话,可以调整到 10000 - 20000
# 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_lru_scan_depth = 4096
innodb_lock_wait_timeout = 10
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 1G
innodb_sort_buffer_size = 64M
innodb_autoinc_lock_mode = 2
innodb_print_ddl_logs = 1
# innodb_flush_neighbors参数,SSD 禁用,非SSD请启用 
innodb_flush_neighbors = 0
#禁用AHI
innodb_adaptive_hash_index = 0


gtid_mode = on
enforce_gtid_consistency = 1
log_replica_updates = 1
# 8.0默认为 row ,从MySQL 8.0.34 起已弃用,并且可能会在 MySQL 的未来版本中删除
#binlog_format = ROW
relay_log = relay.log






# perforamnce_schema settings
performance_schema=ON

[mysqldump]
quick

8.初始化

/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3306/my.cnf --initialize  --user=mysql 

9.设置/etc/init.d启动

cp mysql/support-files/mysql.server /etc/init.d/mysqld

10.启动MySQL

注意:如果不配置名称为 pid-file 的参数,则强依赖 hostname,也就是启动后不能更改hostname,否则不能正常关闭。

启动方式1-service

# 启动
service mysqld start
# 关闭
service mysqld stop
# 查看状态
service mysqld status
  • 在不更改/etc/init.d/mysqld的情况下,my.cnf 文件必须在 basedir 下或 /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 下,且名称必须为 my.cnf
  • 修改 /etc/init.d/mysqld ,把它改为适配的脚本

启动方式2-mysql_safe

/usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql3306/my.cnf --user=mysql &
或
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3306/my.cnf --user=mysql &

启动方式3-systemd

也可配置使用 systemctl 进行启动 官方文档 systemd

  • 多个可以起名为 mysqld3306.service、mysqld3307.service

/usr/lib/systemd/system/mysqld3306.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
# 多用户模式
WantedBy=multi-user.target  

[Service]
User=mysql
Group=mysql

# Have mysqld write its state to the systemd notify socket,启动类型 8.0 推荐使用notify
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service,服务启动命令,mysqld必须是绝对路径
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql3306/my.cnf $MYSQLD_OPTS

# Use this to switch malloc implementation,设置环境变量,可用于更改内存管理库 tcmalloc/jemalloc
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

# 在什么情况下需要重启服务,on-failure 表示只有在服务失败时才会重启
Restart=on-failure
# 指定哪些退出状态码不应该触发重启。这里是 1,表示如果服务以状态码 1 退出,则不会重启。
RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
# 指定是否为服务创建一个独立的临时目录。false 表示不创建独立的临时目录。
PrivateTmp=false

11.修改初始密码

# 查看初始密码,在初始化完成后会自动生成一个初始登陆密码,放在错误日志中,假设当前错误日志未指定路径
grep 'temporary password' /data/mysql3306/data/error.log

# 登陆,密码为上面查询出的密码
mysql -uroot -p

# 修改密码为指定密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';

my.cnf 配置生产参考:5.7(https://github.com/jdaaaaaavid/mysql_best_configuration/blob/master/my.cnf)8.0(https://imysql.cn/my_cnf_generator)

拓展-修改mysql.server 源码适配启动

1.修改参数变量

basedir=/usr/local/mysql
datadir=/data/mysql3306/data
mycnfdir=/data/mysql3306/my.cnf

basedir、datadir 可以不配置,因为在 my.cnf 中已配置了,能读取到

2.修改$print_defaults传入参数,指定配置文件

parse_server_arguments `$print_defaults --defaults-file="$mycnfdir" mysqld server mysql_server mysql.server`

3.修改parse_server_arguments

修改 parse_server_arguments 中的 --pid-file=,添加 --pid_file=,使得可以获取到配置文件中配置为 pid_file的内容

4.mysql_safe启动时候指定配置文件

$bindir/mysqld_safe --defaults-file="$mycnfdir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &

相关推荐

在 Ubuntu 上安装 Zabbix(以 Zabbix 6.4 LTS 版本为例)

Zabbix是一个流行的开源监控解决方案,能够监控各种网络参数和服务器健康状态。一、环境准备系统要求Ubuntu20.04/22.04LTS至少2GBRAM(生产环境建议4GB+)至少1...

如何在 Ubuntu 24.04 服务器上安装 Apache Solr

ApacheSolr是一个免费、开源的搜索平台,广泛应用于实时索引。其强大的可扩展性和容错能力使其在高流量互联网场景下表现优异。Solr基于Java开发,提供了分布式索引、复制、负载均衡及自...

如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven

Maven是由Apache托管的开源工具,用于管理Java项目。它包含一个项目对象模型(POM):一个配置文件(XML),其中包含项目的基本信息,包括配置、项目依赖项等。Maven可以处理...

Cursor的终极对手——Trae Pro最新系统提示词

前段时间,字节的AI编程神器Trae国际版,终于甩出了Pro订阅计划!很多对它又爱又恨的小伙伴,直呼:终于等到你。爱它,是因为Trae长期免费+体验真香;恨它?还不是那该死的排队等待,...

AI系统提示词:V0(ai代码提示)

以下是对V0系统提示词(SystemPrompt)的分部分讲解与解读,帮助你理解其核心内容和设计意图。V0系统提示词##CoreIdentity-Youarev0,Vercel&...

8岁男童失踪第13天,搜救人员发现可疑水库,更恶心的事情发生了

Lookingatyourrequest,Ineedtorewritethearticleaboutthe8-year-oldmissingboywhilemaking...

docker常用指令及安装rabbitMQ(docker安装zabbix)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!

面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而Elasticsearch凭借其强大的全文检索和分布式架构,成为理想解决方案。通过...

ElasticSearch中文分词插件(IK)安装

坚持原创,共同进步!请关注我,后续分享更精彩!!!前言ElasticSearch默认的分词插件对中文支持很不友好。一段话按规则会以每个中文字符来拆解,再分别建立倒排索引。如"中华人民共和国国歌...

SpringBoot使用ElasticSearch做文档对象的持久化存储?

ElasticSearch是一个基于Lucene的开源搜索引擎,广泛应用于日志分析、全文搜索、复杂查询等领域,在有些场景中使用ElasticSearch进行文档对象的持久化存储是一个很不错的选择...

Elasticsearch数据迁移方案(elasticsearch copyto)

前言最近小编要去给客户部署一套系统涉及到了Mysql和ES数据的迁移,下面就给大家分享一下ES数据迁移的几套方案,根据具体的使用场景来选择不同的迁移方案能使你事倍功半,话多说下面就一一介绍。Elast...

Rancher部署单体ElasticSearch(rancher2.5部署)

Rancher是k8s图形管理界面,之前曾有写文章介绍如何安装。ElasticSearch是热门搜索引擎,很多地方都有用到,常规安装部署略显繁琐,本文介绍在k8s下用rancher简易部署ES。1.在...

Elasticsearch在Java项目的搜索实践:从零开始构建高效搜索系统

Elasticsearch在Java项目中的搜索实践:从零开始构建高效搜索系统在现代的Java项目中,数据量激增,传统的数据库查询方式已经无法满足快速检索的需求。这时,Elasticsearch(E...

小白入门-Kibana安装(kibana安装配置)

一Kibana基础1.1介绍Kibana是一款免费且开放的前端应用程序,其基础是ElasticStack,可以为Elasticsearch中索引的数据提供搜索和数据可视化功能。Kiban...

Docker上使用Elasticsearch,Logstash,Kibana

在对一个项目做性能测试时我需要处理我们web服务器的访问日志来分析当前用户的访问情况。因此,我想这是试用ELK的一个好机会。ELK栈首先要注意的是使用它是非常简单的。从决定使用ELK到在本机上搭一个...

取消回复欢迎 发表评论: