介绍

journalctl 本身是由 systemd 管理的系统服务,其全名是 systemd-journald.service。它通过维护结构化的索引日志来收集和存储日志数据,这些日志信息来自于内核、用户进程、标准输入以及系统服务错误。systemd-journald 服务默认自启

将某台服务器上执行的命令实时同步到另外一台服务器

1. 将执行的命令写入文件 /var/log/command_history.log

vim /etc/bashrc

export PROMPT_COMMAND='
RETRN_VAL=$?;
LAST_COMMAND=$(history 1);
if [ "$LAST_COMMAND" != "$LAST_RECORDED_COMMAND" ]; then
echo "$(date "+%Y-%m-%d %H:%M:%S") : $(whoami) : $LAST_COMMAND" >> /var/log/command_hist
ory.log;
LAST_RECORDED_COMMAND="$LAST_COMMAND";
fi
'
trap 'echo "$(date "+%Y-%m-%d %H:%M:%S") : $(whoami) : Exiting shell" >> /var/log/command_hi
story.log' EXIT

2. 将文件实时同步到另外一台服务器

vim /etc/rsyslog.d/histroy_command_auditing.conf

module(load="imfile" PollingInterval="1")

input(type="imfile"
File="/var/log/command_history.log"
Tag="command_history"
Severity="info"
Facility="local0")

#local0.* @@10.0.0.17:514
if $programname == 'command_history' then @@10.0.0.17:514

3. 启动 rsyslog 服务

systemctl enable rsyslog。service --now

一、 部署

源码部署

  • 1.1 安装依赖

    yum -y groupinstall "Development Tools"
    yum -y install readline-devel zlib-devel libicu-devel bison flex

  • 1.2 下载源码

    wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz

  • 1.3 编译安装

    tar -xvf postgresql-16.4.tar.gz
    cd postgresql-16.4
    ./configure --prefix=/usr/local/pgsql-16.4
    make && make install

  • 1.4 创建用户/组

    groupadd postgres
    useradd -m -g postgres postgres
    chown -R postgres:postgres /usr/local/pgsql-16.4/

  • 1.5 配置环境变量

    切换用户: su -l postgres
    编辑文件: vim ~/.bash_profile
    添加如下内容:

    PGPORT=5432
    PGHOME=/usr/local/pgsql-16.4
    PGDATA=/usr/local/pgsql-16.4/data
    LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
    PATH=$PGHOME/bin:$PATH
    export PGPORT PGHOME PGDATA LD_LIBRARY_PATH PATH
  • 1.6 初始化数据库

    su -l postgres
    mkdir -p /usr/local/pgsql-16.4/data
    /usr/local/pgsql-16.4/bin/initdb -D /usr/local/pgsql-16.4/data

  • 1.7 启动数据库

    /usr/local/pgsql-16.4/bin/pg_ctl -D /usr/local/pgsql-16.4/data -l logfile start

  • 1.8 创建用户和DB

    进入pgsql终端: /usr/local/pgsql-16.4/bin/psql -d postgres
    创建数据库:

    CREATE USER $username WITH PASSWORD '$password';
    CREATE DATABASE $dbname OWNER $username;

    images

  • 1.9 配置远程访问

    编辑: vim /usr/local/pgsql-16.4/data/pg_hba.conf
    ipv4 行添加如下: host all all 0.0.0.0/0 md5
    编辑: vim /usr/local/pgsql-16.4/data/postgres.conf
    添加: listen_addresses = '*'

  • 1.10 使用systemd管理

    # /usr/local/pgsql/postgresql-16.service
    [Unit]
    Description=PostgreSQL-16.4
    After=network.target
    [Service]
    Type=forking
    User=postgres
    Group=postgres
    Environment=PGPORT=2345
    Environment=PGDATA=/usr/local/pgsql/data/
    OOMScoreAdjust=-1000
    ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
    ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
    ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s
    TimeoutSec=300
    [Install]
    WantedBy=multi-user.target

    systemctl daemon-reload
    systemctl enable postgresql-16 --now

二、 插件安装

2.1 内置扩展

扩展名称 用途
pg_stat_statements 收集并统计所有 SQL 查询的执行信息,帮助调优查询性能。
hstore 提供键值对存储功能,适合处理半结构化数据。
citext 提供不区分大小写的文本字段类型,适用于忽略大小写的字符串比较操作。
uuid-ossp 生成 UUID,适用于分布式系统中的唯一标识符生成。
pg_trgm 提供基于 trigram 的字符串相似度搜索功能,适用于模糊搜索。
fuzzystrmatch 提供字符串模糊匹配功能,如 Soundex 算法,适用于名字搜索等场景。
intarray 为整型数组提供额外的操作符和函数支持,适合处理数组类型的数据。
cube 提供对多维数据的支持,适用于几何计算和多维数据处理。
tablefunc 提供交叉表功能,适用于生成报表或统计结果时的行转列操作。
ltree 提供对树状结构数据的支持,适用于管理和查询层级结构的数据。
pgcrypto 提供数据加密和解密功能,适用于存储敏感数据。
plpgsql 提供编写存储过程和函数的内置过程语言,适用于复杂业务逻辑的实现。

内置扩展直接在源码目录下的 contribu 中对应的插件目录执行 make && make install .以 pg_stat_statements 为例:

cd postgresql-16.4/contrib/pg_stat_statements/
make && make install

图

psql命令行下:

create extension pg_statements;

2.2 非内置扩展

以安装 mysql_fdw 为例

  • 依赖安装:

    yum install mariadb-devel

  • 源码下载

    wget -O https://github.com/EnterpriseDB/mysql_fdw/archive/refs/tags/REL-2_9_2.tar.gz

  • 导入pgsql和mysql的bin目录

    export PATH=/usr/local/pgsql/bin/:$PATH
    export PATH=/usr/local/mysql/bin/:$PATH

  • 编译安装

    tar -xzvf mysql_fdw-REL-2_9_2.tar.gz && cd mysql_fdw-REL-2_9_2
    make USE_PGXS=1
    make USE_PGXS=1 install

  • 创建扩展

    postgres=# 
    postgres=# create extension mysql_fdw;
    ERROR: failed to load the mysql query:
    libmysqlclient.so: cannot open shared object file: No such file or directory
    HINT: Export LD_LIBRARY_PATH to locate the library.
    postgres=#
  • 解决依赖问题

    将缺少的文件复制到 /usr/local/pgsql/lib 即可

    图

2.3 特殊插件

uuid-ossp 作为内置插件, 该插件的安装比较特殊
uuid-ossp 依赖 uuid-devel, 所以先安装这个包 yum install uuid-devel

  • 重新编译pgsql,在原来的编译选项中加上 --with-uuid-ossp

    ./configure --prefix=/usr/local/pgsql-16.4 --with-uuid-ossp

  • 编译插件
    cd $PGHOME/contrib/uuid-ossp && make && make install

2.4 postGIS 插件安装

安装之前, 在这里查看 PostgreSQL和 PostGIS 的兼容性
https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS

Build List:

Build geos-3.6.0

# build from source
tar -xvf geos-3.6.0.tar.bz2 && cd geos-3.6.0
./configure --prefix=/usr/local/geos-3.6.0
make && make install

# add ldd_path
echo "/usr/local/geos-3.6.0/lib" > /etc/ld.so.conf.d/geos.conf
ldconfig

Build PostGIS-3.1.10

  • Installation

    # Requirement 
    yum install proj proj-devel
    # build from source
    tar -zxvf postgis-3.1.10.tar.gz && cd postgis-3.1.10
    ./configure --with-pgconfig=/usr/local/pgsql-12/bin/pg_config \
    --with-geosconfig=/usr/local/geos-3.6.0/bin/geos-config \
    --without-raster --without-protobuf
  • Enable on PostgreSQL

    /usr/local/pgsql-12/bin/psql -U postgres -d postgres -p 5432

    psql (12.21)
    Type "help" for help.

    postgres=# CREATE EXTENSION postgis;
    CREATE EXTENSION
    postgres=#
    postgres=#
    postgres=# \dx
    List of installed extensions
    Name | Version | Schema | Description
    ---------+---------+------------+------------------------------------------------------------
    plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
    postgis | 3.1.10 | public | PostGIS geometry and geography spatial types and functions
    (2 rows)

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)

一、 配置基于 systemd 的 core dump

该模式下的核心转储文件默认保存在 /var/lib/systemd/coredump, 默认保存三天
该核心转储功能由journal配合产生, 因此控制转储文件的保存目录以及时间较难, 如需自定义, 推荐使用传统方式配置核心转储。

编辑文件 /etc/systemd/system.conf ,添加/修改以下行:

DumpCore=yes
DefaultLimitCORE=infinity

编辑文件 /etc/systemd/coredump.conf , 添加/修改一下行:

[Coredump]
Storage=external # 将核心转储存储在文件系统中
Compress=yes # 是否压缩转储文件
ProcessSizeMax=2G # 大小限制 (0 表示不限制)
ExternalSizeMax=2G
JournalSizeMax=767M
MaxUse=5G
KeepFree=1G

编辑文件 /etc/sysctl.conf 添加/修改以下行:

kernel.core_pattern=|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h

应用上述配置并生效: systemctl daemon-reexec && sysctl -p

二、 core dump 实例分析

使用一个简单的 C 程序验证 core dump

#include <stdio.h>

int main() {
int *p = NULL;
*p = 1; // This will cause a segmentation fault
return 0;
}

编译并执行 gcc test.c && ./a.out

图片

2.2 基于systemd的 coredump 处理

  • 列出所有核心转储
    coredumpctl list
    图片

    • PID: 崩溃进程的 PID。
    • SIG: 导致崩溃的信号编号(如 11 表示 SIGSEGV)
    • COREFILE: 表示核心转储是否存在(present 或 missing)
  • 查看特定核心转储的详细信息
    coredumpctl info <PID>
    图片

  • 导出核心转储文件
    coredumpctl dump <PID>
    图片

  • 分析核心转储
    coredumpctl gdb <PID>
    图片

三、 传统方式配置 coredump

与基于 coredumpctl 方式不同, 该方式下, 转储文件会直接生成

3.1 开启coredump

  • 启用核心转储
    ulimit -c unlimited

    • 编辑 /etc/security/limits.conf 文件,添加或修改以下行:
      * soft core unlimited
      * hard core unlimited
      该配置允许用户生成无限大小的core文件

3.2 自定义转储文件的目录及大小

  • 编辑文件 /etc/sysctl.conf 添加/修改以下行:

    kernel.core_pattern = /var/coredumps/core-%e-%s-%u-%g-%p-%t
    • %e: 可执行文件名
    • %s: 导致 core dump 的信号号
    • %u: 进程的实际用户 ID
    • %g: 进程的实际组 ID
    • %p: 进程 ID
    • %t: core dump 的时间(UNIX 时间戳)
  • 创建转储目录
    mkdir /var/coredumps
    chmod 777 /var/coredumps

  • 应用并生效
    sysctl -p

  • 测试
    可以看见, 该方式下, 转储文件直接生成
    图片

零、 环境介绍

  • OS: CentOS 7.9
  • ELk: v8.17.2
  • Filebeat: v8.17.2
  • Nginx v1.20.1

一、 部署 ELK

  • 添加源

    cat >> /etc/yum.repos.d/elk.repo << EOF
    [ELK]
    name=Elastic repository for 8.x packages
    baseurl=https://artifacts.elastic.co/packages/8.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    EOF
  • 安装
    yum install -y elasticsearch logstash kibana filebeat

二、 配置 ELK

2.1 ElasticSearch 配置

  • 修改监听 /etc/elasticsearch/elasticsearch.yml
    network: "0.0.0.0"

  • 配置 elastic 密码
    /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic

  • 访问测试

    [root@localhost ~]# curl -k -u elastic:f0FdL8-gvj=tfnb-Hugg https://localhost:9200
    {
    "name" : "localhost.localdomain",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "YXsi6PaGTv-LbzCA3zHtIw",
    "version" : {
    "number" : "8.17.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "747663ddda3421467150de0e4301e8d4bc636b0c",
    "build_date" : "2025-02-05T22:10:57.067596412Z",
    "build_snapshot" : false,
    "lucene_version" : "9.12.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
    },
    "tagline" : "You Know, for Search"
    }
  • 配置自启
    systemctl enable elasticsearch --now

2.2 配置 Kibana

  • 修改监听 /etc/kibana/kibana.yml
    server.host: "0.0.0.0"

  • 重启 kibana
    systemctl restart kibana

  • 获取 token
    /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana

  • 获取 verification code
    /usr/share/kibana/bin/kibana-verification-code

  • 访问 http://your_kibana:5601 输入 tokencode 完成配置

  • 配置自启
    systemctl enable kibana

2.3 Logstash 配置

  • 创建配置文件
    cp /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/logstash.conf

  • 修改配置文件如下

    input {
    beats {
    port => 5044
    }
    }

    filter {
    json {
    source => "message"
    }
    }

    output {
    elasticsearch {
    hosts => ["https://192.168.100.107:9200"]
    index => "nginx-log-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "f0FdL8-gvj=tfnb-Hugg"
    ssl_enabled => true
    ssl_certificate_authorities => "/etc/elasticsearch/certs/http_ca.crt" # 这里注意文件和目录的权限需要修改
    }
    }

2.4 Filebeat 配置

  • 编辑配置文件 /etc/filebeat/filebeat.yml

    注释: output.elasticsearch
    取消注释: output.logstash
    根据实际情况配置 logstash 的ip和端口

  • 开启 nginx 日志监控
    filebeat modules enable nginx

  • 编辑配置文件 /etc/filebeat/modules.d/nginx.yml

    - module: nginx
    # Access logs
    access:
    enabled: true
    var.paths: ["/var/log/nginx/access*"]
  • 重启 filebeat
    systemctl restart filebeat

2.5 Nginx 日志格式配置

  • nginx 配置文件
    log_format  main          '{"@timestamp":"$time_iso8601",'
    '"host":"$hostname",'
    '"client_ip":"$remote_addr",'
    '"status":"$status",'
    '"request":"$request",'
    '"body_bytes_sent":"$body_bytes_sent",'
    '"http_referer":"$http_referer",'
    '"http_user_agent":"$http_user_agent"}';

    access_log /var/log/nginx/access.log main;

三、 验证配置

  • 打开 Kibana 访问 Management -> Index Management
    图

  • 创建 data view
    图

  • 添加源
    helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/

  • 安装
    helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

核心概念以及名词解释

一、 Container 容器

容器本质上就是一个特殊的进程,通过 Namespace 实现资源(网络、文件系统等)隔离,通过 Cgroups 实现资源(CPU、内存)限制,让我们使用起来就感觉像在操作虚拟机一样,但其和虚拟机有本质上的区别,那就是容器和宿主机是共享同一个内核的。为了将我们的应用进程运行在容器中,当然就需要有一些方便的接口或者命令去调用 Linux 的系统功能来实现,而容器运行时就是用来运行和管理容器进程、镜像的工具

二、 OCI (Open Container Initiative) 开放容器协议

(OCI) 是由 Docker 于 2015 年发起,并在 Linux Foundation(Linux 基金会)下管理的一个开源项目,旨在定义并维护容器镜像和运行时的开放标准。OCI 规范的目标是确保不同容器引擎、镜像和运行时之间的兼容性和互操作性

OCI 定义了以下三大核心规范:

    1. OCI Runtime Specification(OCI 运行时规范)

      定义了容器的生命周期管理,包括容器的创建、启动、停止、销毁等

    • 规范容器运行时的接口,确保运行时如何以一致的方式执行容器
    • 该规范被广泛采用,runc 就是 OCI 运行时规范的参考实现
    • 核心控制容器的低级细节,如:
      • 容器的进程管理
      • 挂载点、CgroupsNamespace 配置
      • 容器的 rootfs 配置
    1. OCI Image Specification(OCI 镜像规范)

      定义了容器镜像的格式及其元数据。

    • 该规范确保容器镜像在不同的容器运行时(如 DockercontainerdCRI-O 等)中均能无缝兼容。
    • 镜像采用 多层(Layered) 结构,允许增量更新,提高存储和传输效率
    • 定义了镜像的内容清单(Manifest)、配置(Config)及镜像层(Layers)等
    1. OCI Distribution Specification(OCI 分发规范)

      定义了如何通过 HTTP API 来分发容器镜像(镜像仓库规范)

    • 该规范确保镜像可以在不同的镜像仓库(如 Docker HubHarborQuay.io 等)中安全传输和分发。
    • 基于 RESTful API 设计,支持多种身份验证和安全机制
    • 解决了镜像拉取、推送及存储的兼容性问题

OCI 的生态系统

  • RUNC(OCI 运行时的参考实现)
  • Containerd(Docker 的核心容器运行时,完全兼容 OCI)
  • CRI-O(Kubernetes 的轻量级容器运行时)
  • Podman(无守护进程的容器引擎,兼容 OCI)
  • Docker(已将 OCI 规范整合至其引擎)

总结:

Open Container Initiative (OCI) 通过定义开放标准,统一了容器镜像、运行时和分发方式,推动了容器技术的生态繁荣。它的核心目标是让容器环境更加便携、兼容和安全

CRI (Container Runtime Interface) 容器运行时接口

Kubernetes 定义的一套标准化接口,旨在将 Kubernetes (K8s) 与各种容器运行时(如 Docker、containerd、CRI-O 等)解耦。通过 CRI,kubelet可以使用不同的容器运行时,而无需更改自身的代码逻辑,从而提升了 Kubernetes 的灵活性和可扩展性。

图

CRI-O (Container Runtime Interface - Open Container Initiative)

CRI-O 是一个轻量级的 容器运行时(Container Runtime),专为 Kubernetes 设计,完全遵循 Kubernetes 的 CRI(Container Runtime Interface) 接口标准

CRI-ODockercontainerd 三者对比

特点 CRI-O Docker containerd
兼容 Kubernetes ✅ 完全兼容 ❌ 需额外配置 ✅ 完全兼容
遵循 OCI 标准 ✅ 是 ✅ 是 ✅ 是
是否轻量 ✅ 极简设计 ❌ 功能复杂 ✅ 轻量化
镜像管理 ✅ 使用 skopeo ✅ 原生支持 ✅ 使用 ctr
守护进程 ❌ 无守护进程 ✅ 需要 Docker Daemon ✅ 需要守护进程
启动速度 ⚡ 快速 🚶‍♂️ 较慢 ⚡ 快速
存储驱动 支持多种存储后端 使用 Docker 内置机制 使用 snapshotter

CRI-Dockerd 和 CRI-ContainerD

特点 cri-docker cri-containerd
定义 Docker 提供的 CRI 实现,作为 Docker Engine 的桥梁以兼容 Kubernetes containerd 提供的原生 CRI 实现,专为 Kubernetes 设计
架构 kubelet → cri-dockerd → Docker Engine → containerd → runc kubelet → containerd → runc
复杂度 由于引入 Docker Daemon,架构更复杂 轻量化设计,直接对接 Kubernetes,架构更简洁

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

kubeadm init –apiserver-advertise-address=192.168.100.115 –image-repository registry.aliyuncs.com/google_containers –kubernetes-version v1.29.15 –service-cidr=10.10.0.0/12 –pod-network-cidr=10.244.0.0/16 –cri-socket unix:///var/run/cri-dockerd.sock

kubeadm join 192.168.100.115:6443 –token 5p3w36.aoah5z734lw70nji
–discovery-token-ca-cert-hash sha256:fda08928eeeb8cdb424462c29999643a5561bf9ffdf31dabfdc5ca562cce5953 –cri-socket unix:///var/run/cri-dockerd.sock

一、 逻辑备份/恢复

基于MySQL自带的mysqldumpmysqlpump进行逻辑备份和恢复

优点 缺点
可以跨平台和MySQL版本 备份速度慢, 占用较大的cpu和I/O

1.1 逻辑备份

#!/bin/bash

MYSQLDUMP=/data/mysql/bin/mysqldump
MYSQL=/data/mysql/bin/mysql
DBNAME=(db1 db2 db3 db4) ## 输入要备份的数据库,空格隔开。
DATE=$(date -d "now" +%Y-%m-%d)
BACKUP_ROOT=/data/mysql_logical_bak
BACKUP_DIR=${BACKUP_ROOT}/${DATE}
LOGFILE=${BACKUP_DIR}/backup.log
HOST=localhost
PORT=3306
USER=root
PASSWD=$password
EXPIRE_DAYS=30

function fun_mkdir(){
mkdir -p ${BACKUP_DIR}
}

function fun_lock_tables(){
echo "Locking all tables..."
$MYSQL -h${HOST} -P${PORT} -u${USER} -p${PASSWD} -e "FLUSH TABLES WITH READ LOCK;"
}

function fun_unlock_tables(){
echo "Unlocking all tables..."
$MYSQL -h${HOST} -P${PORT} -u${USER} -p${PASSWD} -e "UNLOCK TABLES;"
}

function fun_backup(){
for DB in "${DBNAME[@]}"
do
echo "Backing up $DB..."
$MYSQLDUMP -h${HOST} -P${PORT} -u${USER} -p${PASSWD} \
--compress --databases --routines --quick --set-gtid-purged=OFF \
${DB} | gzip > ${BACKUP_DIR}/${DB}.sql.gz
if [[ $? == 0 ]]; then
echo "$(date -d "now" "+%Y-%m-%d %H:%M:%S") - Database: ${DB} backup successful." >> $LOGFILE
else
echo "$(date -d "now" "+%Y-%m-%d %H:%M:%S") - Database: ${DB} backup failed!" >> $LOGFILE
fi
done
}

function fun_cleanup(){
echo "Cleaning up old backups..."
find ${BACKUP_ROOT} -type d -mtime +${EXPIRE_DAYS} -exec rm -rf {} +
}

source ~/.bash_profile && source /etc/profile

if [ -z $BACKUP_ROOT ]; then
echo "BACKUP_ROOT is not set" && exit 1
fi

fun_mkdir
fun_lock_tables
fun_backup
fun_unlock_tables
fun_cleanup

echo "Backup process completed."

# Uncomment the following line to enable remote backup syncing
###rsync -avrz --delete $BACKUP_ROOT/ root@$REMOTEHOST:$REMOTELOCATION

1.2 逻辑恢复

gunzip < ${BACKUP_DIR}/${DB_NAME}.sql.gz | mysql -h${HOST} -P${PORT} -u${USER} -p${PASSWD}

二、 物理备份/恢复

XtraBackup 是由 Percona 提供的开源备份工具,主要用于 MySQLMariaDBPercona Server 数据库的备份。它可以为 InnoDBXtraDB 存储引擎提供热备份功能,这意味着可以在数据库继续运行、读写数据的情况下进行备份,而不会影响应用程序的正常使用。

2.0 安装 XtraBackup

yum install epel-release -y && yum install percona-xtrabackup -y

2.1 物理备份

#!/bin/bash

DATE=$(date -d "now" +%Y-%m-%d)
CONFIG_FILE="/etc/my.cnf"
BACKUP_ROOT="/data/mysql_physical_bak"
BACKUP_DIR="${BACKUP_ROOT}/${DATE}"
LOGFILE="${BACKUP_DIR}/backup.log"
SOCKET="/usr/local/mysql/mysql.sock"
USER="root"
PASSWD="$password"
PORT=3306
EXPIRE_DAYS=30

function fun_mkdir() {
mkdir -p "${BACKUP_DIR}"
}

function fun_backup() {
innobackupex --defaults-file="${CONFIG_FILE}" \
--user="${USER}" \
--password="${PASSWD}" \
--port="${PORT}" \
--socket="${SOCKET}" \
--compress \
--parallel=4 \
"${BACKUP_DIR}" > "${LOGFILE}" 2>&1
}

function fun_cleanup_old_backups() {
find "${BACKUP_ROOT}" -mindepth 1 -maxdepth 1 -type d -mtime "+${EXPIRE_DAYS}" -exec rm -rf {} \;
}

source ~/.bash_profile && source /etc/profile

if [ -z "${BACKUP_ROOT}" ]; then
echo "BACKUP_ROOT is not set" && exit 1
fi

fun_mkdir
fun_backup
fun_cleanup_old_backups

echo "Backup process completed. Check ${LOGFILE} for details."

# Uncomment the following line to enable remote backup syncing
# rsync -avrz --delete "${BACKUP_ROOT}/" "root@${REMOTE_HOST}:${REMOTE_LOCATION}"

2.2 物理恢复

假设场景: 从主库的物理备份中创建一个从库, 并开启主从复制。
假设物理备份的位置: /data/mysql/backup-physical
主从数据库的数据目录: /data/mysql/data

  • 解压备份
    这个步骤会在每个压缩文件旁边创建一个解压后的版本
    innobackupex --decompress /data/mysql/backup-physical/ > decompress.log 2>&1
    图

  • 恢复到MySQL数据目录
    默认会根据 /etc/my.cnf 恢复, 也可以使用 --datadir="your_data_path"
    --copy-back :复制数据到目标目录下,当前备份数据不删除
    --move-back :移动数据到目标目录下,当前数据会删除(适合存储空间不大的情况)
    xtrabackup --copy-back --target-dir=/data/mysql/backup-physical/

    从库启动之前, 如果主库发生变化, 需要将主库备份时间节点之后的bin-log文件复制到从库的数据目录

  • 修改MySQL数据目录的权限
    chown -R mysql:mysql /data/mysql/data

  • 启动MySQL
    systemctl start mysqld

  • 配置从库

    mysql> 
    mysql> change master to \
    -> master_host='16.167.13.137',
    -> master_user='repl',
    -> master_password='$yourpassword',
    -> master_auto_position=1;
    Query OK, 0 rows affected, 2 warnings (0.04 sec)

    mysql>
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)

2.3 常见问题

主从同步的时候提示: Could not execute Update rows event on table xxxxxx: can't find record in xxxxxx
原因: 从库启动之前主库数据发生变动
解决: 发生数据变动期间的 bin-log 文件复制到从库的数据目录

三、 增量备份

查看某个用户拥有某个数据库的权限

注意这里的 127.0.0.1localhost不一样

mysql> show grants for 'root'@'127.0.0.1';
+-----------------------------------------------------------------------------+
| Grants for root@127.0.0.1 |
+-----------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION |
+-----------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> show grants for 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

一般来说,nfs 用于Linux之间的文件共享, 跨平台使用 samba

零、 环境说明

CLIENT: 192.168.1.201 (CentOS7.9)
SERVER: 192.168.12.73 (Winserver2016)
文档涉及的ip地址以及目录路径请根据实际情况填写,切勿完全复制粘贴。

一、 NFS服务端部署

winserver2016为例,使用powershell部署NFS,其他版本未测试。

1.1 安装 NFS

Import-Module ServerManager
Add-WindowsFeature FS-NFS-Service
Import-Module NFS

图片1

1.2 创建共享目录

New-NfsShare -Name nfs1 -Path C:\Users\Administrator\Desktop\share

1.3 防火墙配置

New-NetFirewallRule -DisplayName "Allow NFS" -Direction Inbound -Protocol TCP -LocalPort 2049 -Action Allow
New-NetFirewallRule -DisplayName "Allow NFS" -Direction Inbound -Protocol UDP -LocalPort 2049 -Action Allow

1.4 目录权限配置

图片1

1.5 挂载

注意: 需要指定版本
mount -t nfs -o vers=4.1 192.168.12.73:/nfs1 /mnt/nfs1

1.6 开机挂载

echo 192.168.1.100:/nfs1 /mnt/nfs1 nfs defaults,vers=4.1 0 0 >> /etc/fstab

0%