|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
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_*
[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
建库 ---------------------------------------------------------------------------- 这里要注意的是配置文件放哪里更合适,有人会放在/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?,
启动 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"
初始化密码修改 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)
免费 这是一个数据库连接的客户端,使用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包,然后填写上类名
只想在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软件本身的安装实际上就是下载解压, 主要工作量在配置文件修改,数据库创建,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;
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 夸克网盘下载