1.修改初始密码

  • 获取初始密码登录
    grep "temporary password" /usr/local/mysql/mysql-err.log

  • 修改初始密码

    mysql> 
    mysql>
    mysql> set password=password("$YourPasswordHere");
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql>
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    mysql>
    mysql>

2.强制重置密码

  • 修改配置文件: /etc/my.cnf

    [mysql]添加: skip_grant_tables

重启MySQL: systemctl restart mysqld

一、 ENV

  • Master: 10.0.0.201
  • Slave: 10.0.0.203
  • mysql-version: 5.7.44

1.1 关闭防火墙和SElinux

systemctl stop firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

1.2 确保两台服务器时间同步

yum install chrony
yum enable chronyd --now

二、 主库配置

2.1 确保以下配置开启

[mysqld]
server-id=1
zlog-bin=/data/mysql/data/binlog/mysql-bin
gtid-mode=on
enforce-gtid-consistency=ON

2.2 为从库创建用户

CREATE USER 'repl'@'10.0.0.203' IDENTIFIED BY '$PASSWORD';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.203';
FLUSH PRIVILEGES;

2.3 锁定主库并获取日志信息

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

输出示例如下, 记下FilePosition, 配置从库的时候用得到。

mysql> 
mysql> flush tables read lock;
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000053 | 2392 | | | 84942b7b-7c8a-11ee-a8db-4609d97455dc:1-26 |
+------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)
mysql>

2.4 解锁主库之前进行数据备份

这部分参考MySQL数据库备份

三、 从库配置

3.1 确保以下配置开启

注意: 主从库的server-id一定不相同

[mysqld]
server-id=2
relay-log=/data/mysql/relay-log
gtid-mode=on
enforce-gtid-consistency=on

3.2 设置从库

mysql> 
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.0.0.201',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='$PASSWORD',
-> MASTER_LOG_FILE='mysql-bin.000053', ## master bin-log filename
-> MASTER_LOG_POS=2392; ## master bin-log position
Query OK, 0 rows affected, 2 warnings (0.69 sec)
mysql>
mysql>
mysql> START SLAVE; ## start replication
Query OK, 0 rows affected (0.06 sec)

3.3 查看从库状态

  • 注意到如下两个参数显示为yes即表示主从复制配置成功
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

      mysql> 
    mysql> show slave status \G
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 10.0.0.201
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000053
    Read_Master_Log_Pos: 2392
    Relay_Log_File: relay-log.000003
    Relay_Log_Pos: 320
    Relay_Master_Log_File: mysql-bin.000053
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Replicate_Do_DB:
    Replicate_Ignore_DB:
    Replicate_Do_Table:
    Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
    Last_Errno: 0
    Last_Error:
    Skip_Counter: 0
    Exec_Master_Log_Pos: 2392
    Relay_Log_Space: 521
    Until_Condition: None
    Until_Log_File:
    Until_Log_Pos: 0
    Master_SSL_Allowed: No
    Master_SSL_CA_File:
    Master_SSL_CA_Path:
    Master_SSL_Cert:
    Master_SSL_Cipher:
    Master_SSL_Key:
    Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:
    Replicate_Ignore_Server_Ids:
    Master_Server_Id: 1
    Master_UUID: 84942b7b-7c8a-11ee-a8db-4609d97455dc
    Master_Info_File: /data/mysql/master.info
    SQL_Delay: 0
    SQL_Remaining_Delay: NULL
    Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
    Master_Retry_Count: 86400
    Master_Bind:
    Last_IO_Error_Timestamp:
    Last_SQL_Error_Timestamp:
    Master_SSL_Crl:
    Master_SSL_Crlpath:
    Retrieved_Gtid_Set:
    Executed_Gtid_Set:
    Auto_Position: 0
    Replicate_Rewrite_DB:
    Channel_Name:
    Master_TLS_Version:
    1 row in set (0.00 sec)

3.4 验证主从复制

  • 主库上执行插入语句:

    create database test;
  • 从库查询该纪录

    show databases;

介绍

Dnsmasq: 一个轻量级的,易配置的 DNS 转发器和 DHCP 服务器。 它旨在为小型网络提供 DNS 和 DHCP 服务。 它还可以用来解析那些公网上没有的,本地网络的主机名称的 IP 地址。

  • 安装
    yum install -y dnsmaqsq

  • 配置

    cache-size=10000
    resolv-file=/etc/dnsmasq-resolv.conf
    addn-hosts=/etc/dnsmasq.hosts
    log-queries
    log-facility=/var/log/dnsmasq.log
    local-ttl=600
    conf-dir=/etc/dnsmasq.d
    strict-order
    listen-address=192.168.10.30,127.0.0.1
  • 启动
    systemctl enable dnsmasq --now

介绍

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

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

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

一、 部署

源码部署

  • 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=/data/pgsql-16.4
    PGDATA=/data/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

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

一、 传统 core dump 配置

1.1 开启 core dump

编辑 /etc/security/limits.conf 文件,添加或修改以下行:

* soft core unlimited
* hard core unlimited

该配置允许用户生成无限大小的core文件

1.2 配置命名模板以及自定义core文件存储目录

创建目录并修改权限如下:
mkdir /var/coredumps
chmod 1777 /var/coredumps

编辑 /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 时间戳)

应用并生效
sysctl -p

二、 配置基于 systemd 的 core dump

编辑 /etc/systemd/system.conf 文件,找到并修改(或添加)以下行:

DumpCore=yes
DefaultLimitCORE=infinity

编辑 /etc/systemd/coredump.conf 文件, 保持默认配置即可

[Coredump]
#Storage=external
#Compress=yes
#ProcessSizeMax=2G
#ExternalSizeMax=2G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=

重载 systemd 配置

systemctl daemon-reexec

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

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

应用并生效
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

图片

3.1 传统方式 coredump 处理

使用 gdb 工具调试 core dump 文件

gdb <path_to_executable> <path_to_core_dump_file>

图片

3.2 基于systemd的 coredump 处理

该模式下的核心转储文件默认保存在 var/lib/systemd/coredump, 默认保存三天

图片

使用 coredumpctl 查看和管理核心转储

  • 列出核心转储

    coredump list
    * 表示已存储的核心
    图片

  • 查看特定进程的核心转储

    coredumpctl list <process_name>

  • 查看核心转储的详细信息

    coredumpctl info <PID>

    图片

  • 分析核心转储文件

    coredumpctl gdb <PID>

  • 删除核心转储文件

    coredumpctl remove <PID>

说明

一、 逻辑备份/恢复

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

优点:
缺点:

1.1 逻辑备份

#!/bin/bash

############## environment ##############
MYSQLDUMP=/data/mysql/bin/mysqldump
DBNAME=(db_web_app gisqbpm log logdb mysql) ## 输入要备份的数据库, 空格隔开。
BACKUP=/data/backup/full_by_databases
LOGFILE=${BACKUP}/log/mysql_backup.log
MYSQLIP=localhost
MYSQLPORT=3306
BKUSER=root
PASSWD=$password
DATE=`date -d "now" +%Y%m%d`

############## make directory ##############
function fun_mkdir(){
if [ ! -d ${BACKUP}/data/${DATE} ]; then
mkdir -p ${BACKUP}/data/${DATE}
fi
if [ ! -d ${BACKUP}/log ]; then
mkdir -p ${BACKUP}/log
fi
}

############## backup mysql database ##############
function fun_backup(){
for DB in ${DBNAME[*]}
do
$MYSQLDUMP -h${MYSQLIP} -P${MYSQLPORT} -u${BKUSER} -p${PASSWD} -C -B -R -q --set-gtid-purged=OFF ${DB} | gzip > $BACKUP/data/${DATE}/${DB}.sql.gz

if [[ $? == 0 ]]; then
echo `date -d "now" "+%Y-%m-%d %H:%M:%S"` >> $LOGFILE
echo "DataBase ${DB} Backup Success!" >> $LOGFILE
echo -e "\n========================" >> $LOGFILE
else
echo `date -d "now" "+%Y-%m-%d %H:%M:%S"` >> $LOGFILE
echo "DataBase ${DB} Backup Fail!" >> $LOGFILE
echo -e "\n========================" >> $LOGFILE
fi
done
}

############## execute the function ##############
source ~/.bash_profile && source /etc/profile
if [ -z $BACKUP ]; then
echo "BACKUP is NULL" && exit 1
fi

fun_mkdir
fun_backup

############## delete 7 days ago backup ##############
if [ -d ${BACKUP}/data ]; then
find ${BACKUP}/data -mtime +30 -type d -exec rm -rf {} \;
fi

###rsync -avrz --delete $BACKUP/data/ root@$REMOTEHOST:$REMOTELOCATION

1.2 逻辑恢复

二、 物理备份

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

2.0 安装 XtraBackup

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

2.1 物理备份

#!/bin/bash

############## environment ##############
BACKUP=/nfs/mysql_backup_physical
LOGFILE=${BACKUP}/log/mysql_backup.log
BKUSER=root
PASSWD=$yourpassword
SOCK=/usr/local/mysql/mysql.sock
PORT=3306

############## make directory ############
function fun_mkdir(){
if [ ! -d ${BACKUP}/data/ ]; then
mkdir -p ${BACKUP}/data/
fi
if [ ! -d ${BACKUP}/log ]; then
mkdir -p ${BACKUP}/log
fi
}

############## backup mysql database ########
function fun_backup(){
innobackupex --defaults-file=/etc/my.cnf --user=${BKUSER} --password=${PASSWD} --port=${PORT} --socket=${SOCK} --compress --parallel=4 ${BACKUP}/data/ 1>${LOGFILE} 2>&1
}

############## execute the function ##########
source ~/.bash_profile && source /etc/profile
if [ -z $BACKUP ]; then
echo "BACKUP is NULL" && exit 1
fi

fun_mkdir
fun_backup

############## delete 7 days ago backup #########
if [ -d ${BACKUP}/data ]; then
find ${BACKUP}/data -mtime +2 -type d -exec rm -rf {} \;
fi

###rsync -avrz --delete $BACKUP/data/ root@$REMOTEHOST:$REMOTELOCATION

2.2 物理恢复

将物理备份的文件复制到MySQL的数据目录

修改权限:

chown -R mysql:mysql /data/mysql/data

解压缩

innobackupex –decompress /backup/mysql_restore/data/

完整备份
增量备份

在线备份
离线备份

本地备份
远程备份

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

注意这里的 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)