mysql8.4
mkdir -p /opt/app/mysql/data/tmp mkdir -p /opt/app/mysql/data/mysql_13301 mkdir -p /opt/app/mysql/data/logs touch /opt/app/mysql/data/logs/my_13301_error.log chown -R mysql:mysql /opt/app/mysql vim /opt/app/mysql/data/my_13301.cnf ``` [client] port = 13301 socket = /opt/app/mysql/data/logs/my_13301.sock default-character-set = utf8 [mysql] no-auto-rehash prompt =\\u@\\h \\D \\R:\\m:\\s [\\d]> default-character-set =utf8 socket =/opt/app/mysql/data/logs/my_13301.sock [mysqld] user = mysql server-id = 13301 port = 13301 socket = /opt/app/mysql/data/logs/my_13301.sock pid-file = /opt/app/mysql/data/logs/my_13301.pid basedir = /opt/app/mysql datadir = /opt/app/mysql/data/mysql_13301 tmpdir = /opt/app/mysql/data/tmp replica_load_tmpdir = /opt/app/mysql/data/tmp character-set-filesystem = utf8mb4 character_set_server = utf8mb4 collation_server = utf8mb4_bin lower_case_table_names = 1 #skip_name_resolve open_files_limit = 65535 back_log = 103 max_connections = 500 max_connect_errors = 10000 #----log settings----# default-time_zone = '+8:00' log_timestamps = SYSTEM log_error_verbosity = 2 init_connect = 'SET NAMES utf8mb4' #sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' log-error = /opt/app/mysql/data/logs/my_13301_error.log log-bin = /opt/app/mysql/data/mysql_13301/mysql-bin binlog_format = row sync_binlog = 0 binlog_cache_size = 32M max_binlog_cache_size = 512M max_binlog_size = 1024M binlog_expire_logs_seconds = 7200 interactive_timeout = 120 wait_timeout = 120 transaction_isolation = READ-COMMITTED read_only=0 #off relay-log = /opt/app/mysql/data/mysql_13301/relay-bin replica_net_timeout = 60 replica_skip_errors = 1062 log_replica_updates = 1 # innodb_page_size = 16384 #default value innodb_data_file_path = ibdata1:1024M:autoextend innodb_temp_data_file_path = ibtmp1:2048M:autoextend innodb_buffer_pool_size = 300M innodb_buffer_pool_instances = 1 innodb_flush_log_at_trx_commit = 1 innodb_thread_concurrency = 0 innodb_file_per_table = 1 max_allowed_packet = 64M max_heap_table_size = 64M sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 32 skip-name-resolve ft_min_word_len = 4 default-storage-engine = InnoDB thread_stack = 192K #tmp_table_size = 64M innodb_thread_concurrency = 0 innodb_lock_wait_timeout = 180 [mysqldump] quick max_allowed_packet = 32M ``` export PATH=/opt/app/mysql/bin:$PATH which mysqld sudo apt-get update sudo apt-get install libaio-dev libnuma-dev libc6 libstdc++6 创建软链接,让 libaio.so.1 指向实际的库文件 sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2 /usr/lib/x86_64-linux-gnu/libaio.so.1 更新库缓存 sudo ldconfig 验证链接是否创建成功 ls -la /usr/lib/x86_64-linux-gnu/libaio.so.1
``` 创建实例 mysqld --defaults-file=/opt/app/mysql/data/my_13301.cnf --initialize --user=mysql tail -f logs/my_13301_error.log 2026-06-28T11:42:25.407821+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Tr;DA02nb,lf 2026-06-28T11:42:27.208027+08:00 0 [System] [MY-015018] [Server] MySQL Server Initialization - end. 启动 nohup mysqld_safe --defaults-file=/opt/data/my_13301.cnf --user=mysql & 关闭方式一 mysqladmin shutdown -uroot -p'rootroot' -S /opt/app/mysql/data/logs/my_13301.sock 关闭方式二 mysql> shutdown; Query OK, 0 rows affected (3.43 sec) 定义别名,方便日常维度 alias mstart="nohup /opt/app/mysql/bin/mysqld_safe --defaults-file=/opt/app/mysql/data/my_13301.cnf --user=mysql &" alias min="/opt/app/mysql/bin/mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock" nohup /opt/app/mysql/bin/mysqld_safe --defaults-file=/opt/app/mysql/data/my_13301.cnf --user=mysql & 关闭方式一 mysqladmin shutdown -uroot -p'rootroot' -S /opt/app/mysql/data/my_13301.cnf 初始化密码修改 mysql -uroot -S /opt/app/mysql/data/logs/my_13301.sock -p # 使用默认的认证插件修改密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'rootroot'; mysqladmin -u用户名 -p旧密码 password 新密码 create user 'automng'@'127.0.0.1' ; GRANT ALL PRIVILEGES ON *.* TO 'automng'@'127.0.0.1' WITH GRANT OPTION; ALTER USER 'automng'@'127.0.0.1' IDENTIFIED BY 'Automng_123'; flush privileges; create user 'automng'@'localhost' ; GRANT ALL PRIVILEGES ON *.* TO 'automng'@'localhost' WITH GRANT OPTION; flush privileges; ALTER USER 'automng'@'localhost' IDENTIFIED BY 'Automng_123'; create user 'automng'@'%' identified by 'Automng_123'; GRANT ALL PRIVILEGES ON *.* TO 'automng'@'%' WITH GRANT OPTION; flush privileges; ALTER USER 'automng'@'%' IDENTIFIED BY 'Automng_123'; ```
常见安装问题
``` ERROR MY-013276 Server Failed to set datadir to '/opt/app/mysql/data/mysql_13301/(OS error: 13 - Permission denied) ERROR MY-013236 Server The designated data directory /opt/app/mysql/data/mysql_13301 is unusable. You can remove all files than the server added to it mysql_13301目录 drwxr-x--- mysql mysql ``` ### 切换到 mysql 用户,测试能否进入目录 sudo -u mysql ls -la /opt/app/mysql/data/mysql_13301 执行该命令真的报 权限不够 ### 给所有父目录增加 "其他用户" 的执行权限 sudo chmod o+x /opt /opt/app /opt/app/mysql /opt/app/mysql/data
超简安装·2
sudo su - root cd /mnt/g/soft/docker/ docker load -i ubuntu24.04_v1.tar docker run -itd --privileged --name zhisu -h zhisu --net=host -v /mnt:/mnt -v /tmp:/tmp -v /media:/media -v /data:/data ubuntu:24.04 bash docker exec -it zhisu bash mkdir /opt/app apt update apt install rsync -y rsync -rltDv /mnt/g/soft/mysql84.tar.gz /opt/app/ useradd mysql cd /opt/app/ tar -xvf mysql84.tar.gz apt install -y libncurses6 libtinfo6 numactl apt-get install libaio-dev libnuma-dev libc6 libstdc++6 apt install net-tools vim pkg-config git ntpdate alsa-utils libxft-dev curl ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2 /usr/lib/x86_64-linux-gnu/libaio.so.1 vim /etc/profile export PATH=/opt/app/mysql/bin:$PATH source /etc/profile touch /opt/app/mysql/data/logs/my_13301.pid chown -R mysql:mysql /opt/app/mysql nohup /opt/app/mysql/bin/mysqld_safe --defaults-file=/opt/app/mysql/data/my_13301.cnf --user=mysql & alias mstart="nohup mysqld_safe --defaults-file=/opt/app/mysql/data/my_13301.cnf --user=mysql &" alias min="mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock" ## 错误排查 ``` # /opt/app/mysql/bin/mysqld --defaults-file=/opt/app/mysql/data/my_13301.cnf --user=mysql /opt/app/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory root@zhisu:/opt/app# find /usr/ -name libaio.so* /usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2 /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2 /usr/lib/x86_64-linux-gnu/libaio.so.1 ```
# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.4 LTS Release: 24.04 Codename: noble ubuntu24.04无法安装mysql.8.0,可以安装mysql.8.4 id mysql sudo su - root cd /opt/app/ tar -xvf mysql80.tar.gz chown -R mysql:mysql /opt/app/mysql sudo apt-get update sudo apt-get install libncurses5 sudo apt-get install libaio-dev libnuma-dev libc6 libstdc++6 # find /usr/ -name libaio.so* /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so /usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2 vim /etc/profile export PATH=/opt/app/mysql/bin:$PATH source /etc/profile nohup /opt/app/mysql/bin/mysqld_safe --defaults-file=/opt/app/mysql/data/my_13301.cnf --user=mysql &
## 重点注意事项 doris的配置文件修改后一旦经过启动,就不知道会在哪留下缓存,永远只认启动时的配置文件 - 哪怕后面将配置文件修改正确,也不管用 - 因此,正确的做法是,一旦发现错误的配置文件经过了启动,就删除整个目录 - 然后重新解压,从新安装 ## JDK ``` rsync -rltDv /mnt/c/soft/* /opt/app/ tar -xvf openjdk-17_linux-x64_bin.tar.gz vim ~/.bashrc export JAVA_HOME=/opt/app/jdk-17 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH . ~/.bashrc source /etc/profile # free -g total used free shared buff/cache available Mem: 46 1 40 0 5 45 Swap: 12 0 12 # cat vi ~/.vimrc cat: vi: No such file or directory set encoding=utf-8 set termencoding=utf-8 set fileencodings=utf-8,gbk,gb18030 set ambiwidth=double ``` ## ENV swap docker本身就没这个,不需要关 mkdir -p /usr/local/bin vim /usr/local/bin/sys_init.sh ``` #!/bin/bash # 设置透明大页为 madvise 模式 echo madvise > /sys/kernel/mm/transparent_hugepage/enabled echo madvise > /sys/kernel/mm/transparent_hugepage/defrag # 可选:添加日志记录以便确认脚本已执行 echo "$(date): Transparent Hugepage set to madvise" >> /tmp/sys_init.log ``` vim .bashrc /usr/local/bin/sys_init.sh . ./.bashrc ``` ulimit -n 655350 cat >> /etc/sysctl.conf << EOF vm.max_map_count = 2000000 EOF # Take effect immediately sysctl -p cat >> /etc/sysctl.conf << EOF net.ipv4.tcp_abort_on_overflow=1 EOF # Take effect immediately sysctl -p vi /etc/security/limits.conf * soft nofile 1000000 * hard nofile 1000000 ``` ## 编辑配置文件 tar -xvf apache-doris-3.1.4-bin-x64.tar.gz mv apache-doris-3.1.4-bin-x64 doris cd doris/ vim fe/conf/fe.conf - docker单节点可以不配置 priority_networks - JDK增加了 -XX:-UseContainerSupport ``` # Java 环境 JAVA_HOME=/opt/app/jdk-17 is_electable = false #单节点所需 frontend_address = 192.168.73.11 priority_networks = 192.168.73.0/24 # 内存配置(默认 8GB) JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:-UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*,classhisto*=trace:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Darrow.enable_null_check_for_get=false --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED" ``` ## 启动FE - 前台启动 bash /opt/app/doris/fe/bin/start_fe.sh - 后台启动 fe/bin/start_fe.sh --daemon # 查看日志 tail -f fe/log/fe.out tail -f fe/log/fe.log ``` # 1. 停止 FE sh /opt/app/doris/fe/bin/stop_fe.sh pkill -f DorisFE # 2. 彻底清理元数据 rm -rf /opt/app/doris/fe/doris-meta/* rm -rf /opt/app/doris/fe/temp # 3. 修改配置文件,强制 FE 为 Master 角色 vim /opt/app/doris/fe/conf/fe.conf ``` tail -n 200 fe.log ps -ef |grep java - 检查FE健康状态 ``` # curl http://192.168.73.11:8030/api/health {"msg":"success","code":0,"data":{"online_backend_num":0,"total_backend_num":0},"count":0}root@zsu:/opt/app/doris/fe/log# ``` mysql -uroot -P9030 -h192.168.73.11 ## BE配置 mkdir /data/doris /opt/app/doris/be/conf# vim be.conf ``` storage_root_path=/data/doris JAVA_HOME=/opt/app/jdk-17 priority_networks = 192.168.73.0/24 mem_limit=28G ``` ``` priority_networks 172.24.23.0/24 确保 BE 绑定到正确的 IP mem_limit 28G 根据你的 46GB 内存调整 storage_root_path /opt/app/doris/be/storage 数据存储路径 webserver_port 8040 HTTP 服务端口 heartbeat_service_port 9050 心跳端口(FE 连接用) brpc_port 8060 BRPC 服务端口 ``` ## 注册 BE 节点 ``` ## connect a alive FE node mysql -uroot -P9030 -h172.24.23.103 ## register BE node ALTER SYSTEM ADD BACKEND "172.24.23.103:9050" ``` ``` docker run -itd --privileged --name kk -h kk --net mydk --ip 192.168.73.11 -p 9030:9030 -p 13301:13301 -p 9081:9081 -p 3000:3000 -p 8030:8030 -p 9000:9000 -v /data:/data -v /mnt:/mnt -v /media:/media -v /tmp:/tmp zsu:1.0 bash docker exec -it kk bash alias kk="docker exec -it kk bash" frontend_address = 192.168.73.11 priority_networks = 192.168.73.0/24 /opt/app/doris/fe/bin/start_fe.sh --daemon curl http://192.168.73.11:8030/api/health ``` bash /opt/app/doris/fe/bin/stop_fe.sh vim /opt/app/doris/fe/conf/fe.conf ## 注册BE ``` # 连接 FE mysql -uroot -P9030 -h127.0.0.1 # 添加 BE 节点 ALTER SYSTEM ADD BACKEND "127.0.0.1:9050"; # 退出 exit; ``` # 后台启动 be/bin/start_be.sh --daemon # 查看日志 tail -f be/log/be.INFO tail -f be/log/be.out ## 内存的分配置 - docker内存默认一半,可以更多64G ,如何为docker分配更多的内存,现在48G够用吗,有这必要吗 - 在此基础上再划分fe,be的内存,这时候还需要注意32G的限制吗? - 系统96G内存,另外这是在WSL镜像模式下安装的docker,如何给docker划分更多的内存 - Intel(R) Core(TM) Ultra 7 155H (1.40 GHz) ``` [wsl2] memory=64GB # 分配给 WSL2 的最大内存,可按需调整 processors=16 # 分配给 WSL2 的逻辑 CPU 核心数,可按需调整 swap=8GB # 设置 8GB 交换空间,实际上doris不建议分配swap ``` Intel Core Ultra 7 155H 采用大小核混合架构,总共有 16 核 22 线程,具体构成为: 6 个性能核(P核):负责高负载任务。 8 个能效核(E核):负责后台任务。 2 个低功耗核心(LPE核):负责极低负载场景
好的,我理解你的需求。你想为BE分配40G内存,需要修改配置中的相关内存参数。 不过你提供的 `JAVA_OPTS_FOR_JDK_17` 中只有 `-Xmx2048m`(JVM堆内存,默认2GB),这个值并不控制BE的整体内存使用。要为BE分配40G内存,需要修改的是 **Docker/容器层面的内存限制** 和 **BE的核心内存参数**。 ### 🔧 需要修改的两个核心配置 #### 1. Docker内存限制(最重要) 在启动BE容器的命令或docker-compose.yml中,将内存限制设置为40G: **Docker Run命令方式:** ```bash docker run -m 40g --memory-swap 40g ... ``` **Docker Compose方式:** ```yaml services: doris-be: image: apache/doris:latest mem_limit: 40g memswap_limit: 40g # ... 其他配置 ``` #### 2. BE配置文件 `be.conf` 中的 `mem_limit` 这个参数控制BE进程可使用**容器内存**的百分比。既然你为容器分配了40G,建议设置为 **90%**(即36G),为系统留出余量: ```properties mem_limit = 90% ``` 如果你想严格限制BE进程最多使用40G,也可以设置为: ```properties mem_limit = 100% ``` ### 📝 关于你提供的 JAVA_OPTS 的说明 你提供的 `JAVA_OPTS_FOR_JDK_17` 中的 `-Xmx2048m`(2GB)是**JVM堆内存**,用于BE中某些Java相关功能(如部分外部函数调用),**不是**BE整体内存。这个值通常不需要调整,保持默认2GB即可。 如果你确实想调整JVM堆内存(一般不需要),可以这样修改: ```bash -Xmx4096m # 改为4GB ``` ### ✅ 完整配置示例 **Docker Compose完整配置:** ```yaml services: doris-be: image: apache/doris:latest container_name: doris-be mem_limit: 40g memswap_limit: 40g environment: - JAVA_OPTS_FOR_JDK_17=-Dfile.encoding=UTF-8 -Djol.skipHotspotSAAttach=true -Xmx2048m -DlogPath=$LOG_DIR/jni.log -Xlog:gc*:$LOG_DIR/be.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Dsun.java.command=DorisBE -XX:-CriticalJNINatives -XX:+IgnoreUnrecognizedVMOptions -Darrow.enable_null_check_for_get=false --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED volumes: - ./be/conf:/opt/apache-doris/be/conf - ./be/data:/opt/apache-doris/be/data - ./be/log:/opt/apache-doris/be/log ports: - "9060:9060" - "8040:8040" - "9050:9050" ``` **对应的 be.conf 关键配置:** ```properties # BE 可使用容器内存的百分比 mem_limit = 90% # 其他重要内存相关参数(保持默认) # max_compressed_byte_percent = 30 # max_base_compressed_byte_percent = 70 # write_buffer_size = 104857600 ``` ### 💡 总结 | 配置项 | 建议值 | 位置 | |--------|--------|------| | 容器内存限制 | `40g` | Docker run 或 Compose 的 `mem_limit` | | BE内存使用百分比 | `90%` (即36G) | `be.conf` 中的 `mem_limit` | | JVM堆内存 | `2048m` (保持默认) | `JAVA_OPTS_FOR_JDK_17` 中的 `-Xmx` | 你只需要修改Docker的内存限制和 `be.conf` 中的 `mem_limit` 即可,`JAVA_OPTS_FOR_JDK_17` 中的 `-Xmx2048m` 不需要改动。这样BE整体可用内存就是40G容器的90%,约36G,留出4G给系统和其他进程缓冲。 你的理解是**正确**的。`mem_limit=80%` 确实是一个**上限值**,用来保护进程,防止它耗尽系统所有内存,而不是BE启动时就立刻占用80%的内存。 ### 🔍 `mem_limit` 的工作方式 这个参数为整个BE进程设置了一个“内存使用红线”。它的核心作用是**限制**——当BE进程的内存使用量达到这个上限后,系统会触发一系列保护机制,比如终止部分查询(Query)或释放缓存,来把内存占用压回安全线以内,从而防止进程因内存溢出(OOM)被操作系统强制杀掉,或导致整个系统不稳定。 ### 🤔 理解这个“上限” 为什么说是“上限”而不是“占用”?可以从Doris的整个内存管理结构中理解: ```mermaid flowchart TD A[宿主机/容器物理内存
例如: 你为容器分配的40G] --> B[Doris BE 进程内存上限
mem_limit = 80% * 40G = 32G] B --> C[tracked 内存
(可管理、可追踪)] B --> D[untracked 内存
(如JVM、RPC等)] C --> E[任务内存
(Query、Load等)] C --> F[全局内存
(Cache、Metadata等)] E --> G[执行时按需申请、释放] F --> H[启动或使用时逐渐填充] ``` 这个图展示了几个关键点: 1. **它是顶层的硬限制**:`mem_limit` 定义了整个BE进程允许使用的内存天花板。 2. **内存是按需使用的**:无论是执行查询(Query)、数据导入(Load),还是系统自身的缓存(Cache),内存都是在实际需要时才申请和使用的,启动时并不会预先占用。 3. **超限后会触发回收或干预**:当BE进程的`tracked`内存(即受管理的部分)申请导致总内存逼近`mem_limit`设定的上限时,Doris会主动采取措施,如杀死占用内存过大的查询,来将内存使用量降下来。 ### 📝 回到你的场景 在之前的讨论中,我们建议在`be.conf`里设置`mem_limit=90%`,就是为BE进程设定了一个明确的安全上限。当BE需要内存时,它会向操作系统申请,用多少拿多少,只要总量不超过你设定的这个上限,系统就能稳定运行。
docker start kk kk cd /opt/app/doris/ vim be/conf/be.conf
mysql简易安装
https://www.mysql.com/downloads/
https://dev.mysql.com/downloads/mysql/

社区通用版下载
mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
582M,mysql server,企业级安装,用的就是这个,这个也够了

mysql-8.0.32-linux-glibc2.12-x86_64.tar
959M,包含以下三个
mysql-test-8.0.32-linux-glibc2.12-x86_64.tar.xz
mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
mysql-router-8.0.32-linux-glibc2.12-x86_64.tar.xz
mysql-router是一个轻量级的故障切换路由器,相当于HA,切IP用的,是个路由,不涉及数据库内部操作
对于企业来说,IP的切换通常由网络部门处理,都是企业级的,所以mysql-router的应用场景较少 
本次安装环境为ubantu,linux安装与之几乎完全一致 

用户创建
----------------------------------------------------------------------------
root用户
这里采用root用户进行安装,服务的启动也使用root用户,
若是企业内首次安装mysql有限用root用户的场景,就解释然后申请开通

添加用户linux 
groupadd mysql
useradd -g mysql mysql

添加用户ubantu 
除了用户,还有一个组,在ubantu上这个命令会自动创建一个同名的mysql组
adduser mysql 

这里涉及用户是否有目录的问题,企业级创建的用户通常没有创建对应的home目录,
如果是集群服务器节点互信,用mysql可以,用root也可以,或者用已有的互信用户也行,
重点是不影响互信的功能


软件安装目录
----------------------------------------------------------------------------
此压缩包,是编辑好的,相关动态库都已经包含其中,解压就可直接使用
安装目录随意,企业级的关键在于不同服务器位置的统一,便于平台统一维护,尤其是后面要创建数据目录
tar -xvf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.32-linux-glibc2.12-x86_64 /opt/app/mysql
chown -R mysql.mysql  /opt/app/mysql

环境变量配置,不是必需,配置是为了使用方便
export PATH=/opt/app/mysql/bin:$PATH

root@xt:~# vim /etc/profile
root@xt:~# source /etc/profile
root@xt:~# which mysql
/opt/app/mysql/bin/mysql


数据目录创建
----------------------------------------------------------------------------
要求统一,如果可能存在一个服务器多个实例的场景,也要统一规划
主要考虑的还是磁盘大小,要考虑业务未来3年的增长,备份存量,不可能一年玩一次数据库迁移

mkdir -p /opt/data/tmp
mkdir -p /opt/data/mysql_13301
mkdir -p /opt/data/logs
chown -R mysql.mysql /opt/data/logs
chown -R mysql.mysql /opt/data/mysql_13301/
chown -R mysql.mysql /opt/data/tmp/

第2个实例的数据目录
mkdir -p /opt/data/mysql_13302
chown -R mysql.mysql /opt/data/mysql_13302/
多个实例之间共用相同的日志目录,日志监控,报警,读取相同的目录
数据实例目录可以通过实例参数读取,也可以脚本匹配/opt/data/mysql_* 
mysql配置文件
vim /opt/data/my_13301.cnf
[client]
port                  = 13301
socket                = /opt/app/mysql/data/logs/my_13301.sock
default-character-set = utf8

[mysql]
no-auto-rehash
prompt                 =\\u@\\h \\D \\R:\\m:\\s [\\d]>
default-character-set  =utf8
socket                 =/opt/app/mysql/data/logs/my_13301.sock

[mysqld]
user        = mysql
server-id   = 13301
port        = 13301
socket      = /opt/app/mysql/data/logs/my_13301.sock
pid-file    = /opt/app/mysql/data/logs/my_13301.pid

basedir                  = /opt/app/mysql
datadir                  = /opt/app/mysql/data/mysql_13301
tmpdir                   = /opt/app/mysql/data/tmp
replica_load_tmpdir      = /opt/app/mysql/data/tmp

character-set-filesystem = utf8mb4
character_set_server     = utf8mb4
collation_server         = utf8mb4_bin
lower_case_table_names   = 1


#skip_name_resolve
open_files_limit    = 65535
back_log            = 103
max_connections     = 500
max_connect_errors  = 10000

#----log settings----#
default-time_zone       = '+8:00'
log_timestamps          = SYSTEM
log_error_verbosity     = 2
init_connect            = 'SET NAMES utf8mb4'
#sql_mode                = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
log-error               = /opt/app/mysql/data/logs/my_13301_error.log
log-bin                 = /opt/app/mysql/data/mysql_13301/mysql-bin

binlog_format           = row
sync_binlog             = 0
binlog_cache_size       = 32M
max_binlog_cache_size   = 512M
max_binlog_size         = 1024M

binlog_expire_logs_seconds        = 7200
interactive_timeout     = 120
wait_timeout            = 120
transaction_isolation   = READ-COMMITTED

read_only=0                        #off

relay-log               = /opt/app/mysql/data/mysql_13301/relay-bin
replica_net_timeout     = 60
replica_skip_errors     = 1062
log_replica_updates     = 1  #


innodb_page_size               = 16384  #default value
innodb_data_file_path          = ibdata1:1024M:autoextend
innodb_temp_data_file_path     = ibtmp1:2048M:autoextend    
innodb_buffer_pool_size        = 300M
innodb_buffer_pool_instances   = 1
innodb_flush_log_at_trx_commit = 1
innodb_thread_concurrency      = 0
innodb_file_per_table          = 1

max_allowed_packet        = 64M
max_heap_table_size       = 64M
sort_buffer_size          = 4M
join_buffer_size          = 4M
thread_cache_size         = 32
skip-name-resolve
ft_min_word_len           = 4
default-storage-engine    = InnoDB
thread_stack              = 192K
#tmp_table_size           = 64M
innodb_thread_concurrency = 0
innodb_lock_wait_timeout  = 180


[mysqldump]
quick
max_allowed_packet = 32M
各个操作都是以root用户操作的,添加文件需要重新授权
chown -R mysql.mysql /opt/data 
mysql创建实例
建库
----------------------------------------------------------------------------
这里要注意的是配置文件放哪里更合适,有人会放在/etc目录下,
但配置文件决定的是库的创建,也就是说配置文件与库紧密相关,
那么它与数据文件同级放更合适一些,如果你要COPY走一份数据文件,就顺便把与之相关的配置文件也COPY走 

mysql5.7或mysql8指定配置文件创建数据库
which mysqld 
mysqld --defaults-file=/opt/data/my_13301.cnf  --initialize --user=mysql 


安装过程中查看日志,如果报错可以查询具体错误内容,无错会有一个临时密码
tail -f logs/my_13301_error.log
[Server] A temporary password is generated for root@localhost: iE+jJlw!w9?,

mysql启动与关闭
启动
nohup mysqld_safe  --defaults-file=/opt/data/my_13301.cnf  --user=mysql &


关闭方式一
mysqladmin shutdown -uroot -p'rootroot' -S /opt/data/logs/my_13301.sock

关闭方式二
mysql> shutdown;
Query OK, 0 rows affected (3.43 sec)

定义别名,方便日常维度
alias mstart="nohup mysqld_safe  --defaults-file=/opt/app/mysql/data/my_13301.cnf  --user=mysql &"
alias min="mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock"
更新root密码
初始化密码修改
mysql -uroot -S /opt/data/logs/my_13301.sock -p 

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'rootroot';
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;

mysqladmin -u用户名 -p旧密码 password 新密码 
mysqladmin -u root password 'otA8_b19H78rqu' -S /opt/data/logs/my_13301.sock


mysql_native_password
执行本地身份验证的插件;
基于本机密码哈希方法实现身份验证。

sha256_password
为用户帐户密码实现SHA-256哈希,比本地身份验证更强;
随着技术的发展,SHA1和其他哈希算法的前身(例如MD5)已被证明非常容易破解;
sha2更笼统地指SHA-2类加密算法,其中256位加密是其中的一种256长度的实例。

caching_sha2_password
sha256_password实现基本的SHA-256身份验证;
caching_sha2_password实现SHA-256身份验证(如sha256_password),
但在服务器端使用高速缓存可提高性能,并具有其他功能可更广泛地应用。

mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.12 sec)
创建管理用户
创建管理用户 
drop user 'automng'@'127.0.0.1' ;
drop user 'automng'@'localhost' ;
drop user 'automng'@'%';

create user 'automng'@'127.0.0.1' ;
GRANT ALL PRIVILEGES ON *.* TO 'automng'@'127.0.0.1' WITH GRANT OPTION;
flush privileges;
ALTER USER 'automng'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'Automng_123';

create user 'automng'@'localhost' ;
GRANT ALL PRIVILEGES ON *.* TO 'automng'@'localhost'  WITH GRANT OPTION;
flush privileges;
ALTER USER 'automng'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Automng_123';

create user 'automng'@'%' identified by 'Automng_123';
GRANT ALL PRIVILEGES ON *.* TO 'automng'@'%'  WITH GRANT OPTION;
flush privileges;
ALTER USER 'automng'@'%' IDENTIFIED WITH mysql_native_password BY 'Automng_123';

mysql> select user,host,password_expired,password_last_changed,password_lifetime from mysql.user;
+------------------+-----------+------------------+-----------------------+-------------------+
| user             | host      | password_expired | password_last_changed | password_lifetime |
+------------------+-----------+------------------+-----------------------+-------------------+
| automng          | %         | N                | 2023-01-29 16:53:46   |              NULL |
| automng          | 127.0.0.1 | N                | 2023-01-29 16:53:46   |              NULL |
| automng          | localhost | N                | 2023-01-29 16:53:46   |              NULL |
| mysql.infoschema | localhost | N                | 2023-01-29 15:39:40   |              NULL |
| mysql.session    | localhost | N                | 2023-01-29 15:39:40   |              NULL |
| mysql.sys        | localhost | N                | 2023-01-29 15:39:40   |              NULL |
| root             | localhost | N                | 2023-01-29 16:51:59   |                 0 |
+------------------+-----------+------------------+-----------------------+-------------------+

刷新权限
flush privileges;

更改用户的加密方式
ALTER USER 'automng'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'Automng_123';
ALTER USER 'automng'@'%' IDENTIFIED WITH caching_sha2_password BY 'Automng_123';

mysql> select host,user,plugin from mysql.user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| %         | automng          | caching_sha2_password |
| 127.0.0.1 | automng          | mysql_native_password |
| localhost | automng          | caching_sha2_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | mysql_native_password |
+-----------+------------------+-----------------------+
7 rows in set (0.00 sec)

dbeaver数据库客户端
 
免费
这是一个数据库连接的客户端,使用Java编写,有windows,mac,ubantu多个系统的版本,需要先配置JDK环境
它连接数据库的驱动就是Java连接数据库的驱动,如果你是Java程序员,可直接将你代码中连接数据库的驱动拿过来用
如果不是联网环境,需要先下载相关Java连接数据库的驱动,点击编辑驱动
连接mysql数据库因版本不同驱动名称有细微差别,就是Java代码连接池配置的那一套 

驱动类型:MySQL 
类名:com.mysql.jdbc.Driver (这个Java类名因版本不同会有细微差异)
添加文件,添加java连接数据库的驱动,mysql-connector-java-5.1.49.jar 

com.mysql.jdbc.Driver,导入的是 mysql-connector-java 5
com.mysql.cj.jdbc.Driver,导入的是 mysql-connector-java 8

驱动这一部分剩下的部分不需要填写,就是导入驱动jar包,然后填写上类名
mysql超简安装
只想在linux上简单搭建个mysql,能用就行,不要求什么优化配置,能不能快速搞定?

答案是超简安装
超简安装就是将已经安装好的一个数据库+配置文件打包


ubantu上的一次操作记录,linux此方式及此包同样可行
sudo apt-get update  
sudo apt-get install libncurses5

不更换数据目录
---------------------------------------------------------------------------------
操作开始,进入root 用户:
系统上没有mysql用户,adduser提前创建

解压mysql_8.0.32.tar.gz压缩包 (文章结尾可以下载,在参考部分或点击直接下载)
cd /opt/app
root@ai1:/opt/app# tar -xvf mysql_8.0.32.tar.gz

chown -R mysql.mysql /opt/app/mysql

配置环境变量
root@ai1:~# vim /etc/profile
export PATH=/opt/app/mysql/bin:$PATH
root@ai1:~# source /etc/profile

以root用户启动
nohup mysqld_safe  --defaults-file=/opt/app/mysql/data/my_13301.cnf  --user=mysql &
或者 
nohup /opt/app/mysql/bin/mysqld_safe  --defaults-file=/opt/app/mysql/data/my_13301.cnf  --user=mysql &

访问
mysql -uroot -prootroot -S /opt/app/mysql/data/logs/my_13301.sock
mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock

这是一个空库,需要自己提前创建数据库
create database db1;

启动与关闭
alias mstart="nohup mysqld_safe  --defaults-file=/opt/app/mysql/data/my_13301.cnf  --user=mysql &"
alias min="mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock"

注意点:先创建mysql用户,然后在/opt/app下解压,这个目录是固定的,必须是这个目录,然后就可以用了
若要换软件安装目录,需要更新配置文件中的basedir目录,
换其他配置更新配置文件中对应的相关参数



更换数据目录
----------------------------------------------------------------
数据目录原来在/opt/data目录,现在换为/opt/app/mysql/data,换其他位置参考下面的操作
$ sudo su - root
# adduser mysql
rsync -rltDv mysql_8.0.32.tar.gz /opt/app/
cd /opt/app 
tar -xvf mysql_8.0.32.tar.gz 


修改配置文件相关路径
将/opt/data目录替换为实际上的/opt/app/mysql/data
root@ai1:/opt/app/mysql/data# cp my_13301.cnf my_13301.cnf.bak
root@ai1:/opt/app/mysql/data# sed -i 's/\/opt\/data/\/opt\/app\/mysql\/data/g' my_13301.cnf

cd /opt/app/mysql/data/mysql_13301
sed -i 's/\/opt\/data/\/opt\/app\/mysql\/data/g' mysql-bin.index
chown -R mysql.mysql /opt/app/mysql

启动
root@ai1:~# vim /etc/profile
export PATH=/opt/app/mysql/bin:$PATH
root@ai1:~# source /etc/profile

nohup mysqld_safe  --defaults-file=/opt/app/mysql/data/my_13301.cnf  --user=mysql &
root@ai1:~# mysql -uroot -prootroot -S /opt/app/mysql/data/logs/my_13301.sock
mysql> exit
Bye
root@ai1:~# 
root@ai1:~# mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock
mysql> shutdown;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye

超简安装数据目录变更

 
验证mysql可用后,如果数据量大,可以换一个更大空间目录作为数据目录 

mkdir -p /wks/data/mysql
chown mysql.mysql /wks/data/mysql/

关闭mysql,然后同步文件 
rsync -rltDv /opt/app/mysql/data/ /wks/data/mysql/

[root@nd /]#ls /wks/data/mysql/
logs  my_13301.cnf  my_13301.cnf.bak  mysql_13301  tmp

用 go/python 实现配置文件的修改得了... 

 

mysql批量建库
mysql软件本身的安装实际上就是下载解压,
主要工作量在配置文件修改,数据库创建,root密码修改,用户创建等等 

方便的前提是提前创建好一个demo,相当于创建一个模板,后续批量建库就是把这个模板COPY过去,
授权 chown -R mysql.mysql /opt/data 
然后启动 

前面安装的时候有提到过统一规划,规划好了,后续维护就方便,遇到特殊情况,微调一下配置文件就可以了
安装并修改配置

 
添加用户mysql 
groupadd mysql
useradd -g mysql mysql


cp mysql_8.0.32.tar.gz /data/
tar -xvf mysql_8.0.32.tar.gz
cd /data/mysql/data

数据目录 
[root@nd data]# ls
logs  my_13301.cnf  my_13301.cnf.bak  mysql_13301  tmp

数据总目录:
下面放日志目录,tmp目录,各种实例的配置文件,实例目录
实例目录以端口区分

可通过下面的命令修改数据目录与基目录 
python create_conf.py -d /data/mysql/data -b /data/mysql

端口默认13301,如果更换端口要确保实例目录存在
datadir                  = /data/mysql/data/mysql_13301


这里修改了数据目录,基目录,buffer_pool_size
python mysql_create_conf.py -d /data/mysql/data -b /data/mysql -s 2G


alias mstart="nohup mysqld_safe  --defaults-file=/opt/app/mysql/data/my_13301.cnf  --user=mysql &"
alias min="mysql -uautomng -pAutomng_123 -S /opt/app/mysql/data/logs/my_13301.sock"


vim mysql_13301_start.sh 
nohup /data/mysql/bin/mysqld_safe  --defaults-file=/data/mysql/data/my_13301.cnf  --user=mysql &

sh mysql_13301_start.sh 


无法启动时查看错误日志
/data/mysql/data/logs/my_13301_error.log

进入mysql 
/data/mysql/bin/mysql -uroot -prootroot -S /data/mysql/data/logs/my_13301.sock
/data/mysql/bin/mysql -uautomng -pAutomng_123 -S /data/mysql/data/logs/my_13301.sock


更新root密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'w42703_W42703';
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;

create_conf.py脚本

python create_conf.py -b /data/mysql -d /data/mysql/data -s 2G -P 3307

 
进入datadir目录 
vim create_conf.py

[root@nd data]# python create_conf.py -b /data/mysql -d /data/mysql/data -s 2G -P 3307
cp -r /data/mysql/data/mysql_13301 /data/mysql/data/mysql_3307
nohup /data/mysql/bin/mysqld_safe  --defaults-file=/data/mysql/data/my_3307.cnf  --user=mysql &

[root@nd data]# ls
create_conf.py  logs  my_13301.cnf  my_13301.cnf.bak  my_3307.cnf  mysql_13301  mysql_3307  mysql_start_3307.sh  tmp

进入mysql 
/data/mysql/bin/mysql -uroot -prootroot -S /data/mysql/data/logs/my_3307.sock
/data/mysql/bin/mysql -uautomng -pAutomng_123 -S /data/mysql/data/logs/my_3307.sock

更新root密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Automng_123';
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;

脚本内容

 
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys, getopt
import os


#读取当前目录下的配置文件
def get_conf_all(file_name = 'my_13301.cnf.bak'):
    """读取配置文件 
    """
    absolute_path = os.path.abspath(file_name)
    content= ''
    # 打开文件  
    with open(absolute_path, 'r') as file:  
        # 读取文件的所有内容  
        content = file.read()  
        
    return content

def change_bin_index(data_dir,file_name = 'mysql_13301/mysql-bin.index'):
    """读取配置文件 
    """
    absolute_path = os.path.abspath(file_name)
    content= ''
    if os.path.exists(absolute_path):
        # 打开文件  
        with open(absolute_path, 'r') as file:  
            # 读取文件的所有内容  
            content = file.read()  
    else:
        print(absolute_path+" does not exists")
        return 

    content = content.replace("/opt/app/mysql/data",data_dir)
    with open(file_name, "w") as file:  
        file.write(content)

    return content


def main(argv):
    base_dir = ''
    data_dir = ''
    port = 13301
    try:
        content = get_conf_all()
        opts, args = getopt.getopt(argv,"hb:d:P:s:",["bbase_dir=","ddata_dir=","Pport=","spool_size="])
    except getopt.GetoptError:
        print('create_conf.py -b base_dir -d data_dir -P port -s pool_size')
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print('create_conf.py -b base_dir -d data_dir -P port -s pool_size')
            sys.exit()

        elif opt in ("-d", "--ddata_dir"):
            data_dir = arg
            # print('set data_dir=', data_dir)
                
            if data_dir[-1]=="/":
                data_dir = data_dir[:-1]
            content = content.replace("/opt/data",data_dir)
            bin_index_content = change_bin_index(data_dir)

        elif opt in ("-P", "--Pport"):
            port = arg
            
            content = content.replace("13301",port)
            datadir2 = data_dir+"/mysql_"+port
            copy_cmd = "cp -r "+data_dir+"/mysql_13301 "+datadir2
            print(copy_cmd)

            try:
                os.system(copy_cmd)

                bin_index_content = bin_index_content.replace("13301",port)
                file_name = datadir2+'/mysql-bin.index'
                absolute_path = os.path.abspath(file_name)

                if os.path.exists(absolute_path):
                    with open(absolute_path, "w") as file:  
                        file.write(bin_index_content)
            except Exception as e:
                print(e)

            if not os.path.exists(datadir2):
                print(datadir2,"The directory does not exist. Please copy the original data directory to this directory")
                print("check the mysql-bin.index in ",datadir2)

        elif opt in ("-s", "--spool_size"):
            pool_size = arg
            content = content.replace("300M",pool_size)

        elif opt in ("-b", "--bbase_dir"):
            base_dir = arg
            # print('set base_dir=', base_dir)
            if base_dir[-1]=="/":
                base_dir = base_dir[:-1]
            content = content.replace("/opt/app/mysql", base_dir)

    mysql_conf_path  = os.path.abspath("my_"+str(port)+".cnf")
    # print("mysql_conf_path:",mysql_conf_path)
    with open(mysql_conf_path, "w") as file:  
        file.write(content)

    start_msqyl = "nohup "+base_dir+"/bin/mysqld_safe  --defaults-file="+data_dir+"/my_"+port+".cnf  --user=mysql &"
    print(start_msqyl)
    mysql_start_shell = os.path.abspath("mysql_start_"+port+".sh")
    with open(mysql_start_shell, "w") as file:  
        file.write(start_msqyl)
    os.system("chown -R mysql.mysql "+datadir2)

    log_file = data_dir+"/logs/my_"+port+"_error.log"
    if not os.path.exists(log_file):
        os.system("touch "+log_file)
        os.system("chown -R mysql.mysql "+log_file)
            
if __name__ == "__main__":
    main(sys.argv[1:])
    
参考
    mysql_8.0.32.tar.gz 夸克网盘下载