mysql安裝:https://blog.csdn.net/qq_39399966/article/details/120205461
系統:centos7.9
數據庫版本:mysql8.0.28
1.卸載舊的mysql,保證環境純凈
rpm -qa | grep mariadb
mariadb-5....
rpm -e --nodeps 軟件
rpm -e --nodeps mariadb-5...
rpm -qa | grep -i mysql ?#查看是否安裝過mysql
#查找mysql文件,并將其刪除
find / -name mysql
whereis mysql
rm -rf 查詢到的mysql路徑
rm /etc/my.cnf
rpm -qa | grep -i mysql
#uname -m
arch
x86_64 ?#我的是x86
#拉取包,如果你是arch,下載https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.28-1.el7.aarch64.rpm-bundle.tar
wget https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar?
#安裝依賴
yum install openssl-devel perl-Test-Simple perl-JSON.noarch perl.x86_64 perl-devel.x86_64 autoconf numactl openssl-devel.x86_64 openssl.x86_64 -y
#rpm安裝順序
#1梯隊
rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-libs-8.0.26-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-client-8.0.26-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-server-8.0.26-1.el7.x86_64.rpm --nodeps
#2梯隊
rpm -ivh mysql-community-libs-compat-8.0.26-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-embedded-compat-8.0.26-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-devel-8.0.26-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-test-8.0.26-1.el7.x86_64.rpm --nodeps
#數據庫初始化
mysqld --initialize --console
#目錄授權
chown -R mysql:mysql /var/lib/mysql/
#啟動
systemctl start mysqld && systemctl enable --now mysqld && systemctl status mysqld
#查看密碼
cat /var/log/mysqld.log | grep password
#登錄
mysql -u root -p
#改密碼
alter USER 'root'@'localhost' IDENTIFIED BY 'W!@f2rfsdf;';
#登錄授權
use mysql;
select host, user, authentication_string, plugin from user;
update user set host = "%" where user='root';
flush privileges;
#密碼驗證方式更改
use mysql;
alter USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'heihei3431@:';
flush privileges;
#創建用戶并授權
CREATE USER 'xixi'@'%' IDENTIFIED BY 'heihei@13のqednasdo11';
GRANT ALL PRIVILEGES ON *.* TO 'xixi'@'%' WITH GRANT OPTION;
ALTER USER 'xixi'@'%' IDENTIFIED WITH mysql_native_password BY 'heihei@13のqednasdo11';
FLUSH PRIVILEGES;
UPDATE mysql.user SET authentication_string = PASSWORD('qwc@113.'), plugin = 'mysql_native_password' WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;
----------------------mysql:熱備份,清理日志數據,注意:mysql服務器需要和遠程服務器是免密登錄,創建公私鑰,這個腳本只是實現了全備
#腳本功能:
#1.清理二進制日志binlog
#2.清理錯誤日志(Error Log)。
#3.清理慢查詢日志(Slow Query Log)。
#4.執行全量備份。
#5.將備份文件上傳到遠程服務器。
前言:需要替換你的日志路徑,每個人的情況不一樣
yum -y install rsync
#遠程服務器:
ssh-keygen -t rsa -b 2048
ssh-copy-id 150mysql
mkdir -p /store/mysql
chmod 755 /store/mysql
#mysql服務器:
ssh-keygen -t rsa -b 2048
ssh-copy-id 136node
mkdir -p /backup/{mysql,script,logs}
chmod -R 755 /backup/{mysql,script,logs}
mysql_config_editor set --login-path=backup --user=root --password ?#插件存儲密碼,用戶腳本免交互登錄mysql
#日志存放位置查看
mysql -uroot -p
show variables like '%log_error%'; #查看錯誤日志,報錯查看這個日志
log-error=/var/log/mysql/error.log
show variables like '%log_bin%'; ?#binlog日志用于數據恢復,show variables like '%binlog_format%'; ?#查看binlog記錄信息的方式 ?ROW行記錄
log_bin=/var/lib/mysql/mysql-bin
SHOW VARIABLES LIKE 'slow_query_log'; #查看慢日志
/var/log/mysql/mysql-slow.log
vim /etc/my.cnf
[client]
sock=/data/mysql/mysql.sock
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid
log_bin=/data/mysql/mysql-bin
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
sudo mkdir -p /var/log/mysql
sudo chown -R mysql:mysql /var/log/mysql
systemctl restart mysqld
---【全量備份+熱備份+rsync】
[root@150m01 /backup/script]# cat auto_mysqldump.sh
#!/bin/bash
# 設置環境變量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
# 獲取當前日期
DATE="$(date +%F)"
# 本地備份目錄
local_backup_dir=/backup/mysql
mkdir -p "${local_backup_dir}"
# 日志文件路徑
log_file="/backup/logs/mysql_backup.log"
mkdir -p "$(dirname "${log_file}")"
# 遠程服務器信息
REMOTE_SERVER="136node" ?# 替換為遠程服務器的IP地址或主機名
REMOTE_DIR="/store/mysql" ?# 替換為遠程服務器的備份目錄
REMOTE_SSH_PORT=22 ?# 替換為遠程服務器的SSH端口
# MySQL配置
MYSQL_LOGIN_PATH="backup" ?# 使用 mysql_config_editor 設置的登錄路徑
SOCKET_FILE="/var/lib/mysql/mysql.sock" ?# MySQL 套接字文件路徑
# 清理二進制日志
echo "$(date): Cleaning up binary logs..." >> "${log_file}"
mysql --login-path=${MYSQL_LOGIN_PATH} --socket=${SOCKET_FILE} -e "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 30 DAY;" >> "${log_file}" 2>&1
# 清理錯誤日志
echo "$(date): Cleaning up error log..." >> "${log_file}"
ERROR_LOG="/var/log/mysql/error.log"
if [ -f "$ERROR_LOG" ]; then
? ? cat /dev/null > $ERROR_LOG
? ? echo "$(date): Error log cleaned." >> "${log_file}"
else
? ? echo "$(date): Error log not found." >> "${log_file}"
fi
# 清理慢查詢日志
echo "$(date): Cleaning up slow query log..." >> "${log_file}"
SLOW_QUERY_LOG="/var/log/mysql/mysql-slow.log"
if [ -f "$SLOW_QUERY_LOG" ]; then
? ? cat /dev/null > $SLOW_QUERY_LOG
? ? echo "$(date): Slow query log cleaned." >> "${log_file}"
else
? ? echo "$(date): Slow query log not found." >> "${log_file}"
fi
# 執行 MySQL 熱備份
echo "$(date): Performing MySQL hot backup..." >> "${log_file}"
mysqldump --login-path=${MYSQL_LOGIN_PATH} --socket=${SOCKET_FILE} --all-databases > "${local_backup_dir}/hot_backup-${DATE}.sql"
if [ $? -eq 0 ]; then
? ? echo "$(date): MySQL hot backup completed successfully" >> "${log_file}"
else
? ? echo "$(date): MySQL hot backup failed" >> "${log_file}"
? ? exit 1
fi
# 使用 rsync 同步本地備份文件到遠程服務器
echo "$(date): Syncing backup files to remote server using rsync..." >> "${log_file}"
rsync -vzrtopg --progress --delete -e "ssh -p ${REMOTE_SSH_PORT}" "${local_backup_dir}/" "${REMOTE_SERVER}:${REMOTE_DIR}/" >> "${log_file}" 2>&1
if [ $? -eq 0 ]; then
? ? echo "$(date): Backup files synced successfully" >> "${log_file}"
else
? ? echo "$(date): Backup files sync failed" >> "${log_file}"
? ? exit 1
fi
# 刪除本地舊的備份文件(保留最近30天的備份)
echo "$(date): Deleting old local backups..." >> "${log_file}"
find "${local_backup_dir}" -name "hot_backup-*.sql" -mtime +30 -delete
if [ $? -eq 0 ]; then
? ? echo "$(date): Old local backups deleted successfully" >> "${log_file}"
else
? ? echo "$(date): Old local backups deletion failed" >> "${log_file}"
fi
# 在遠程服務器上刪除舊的備份文件(保留最近30天的備份)
echo "$(date): Deleting old remote backups..." >> "${log_file}"
ssh -p ${REMOTE_SSH_PORT} "${REMOTE_SERVER}" "find ${REMOTE_DIR} -name 'hot_backup-*.sql' -mtime +30 -delete" >> "${log_file}" 2>&1
if [ $? -eq 0 ]; then
? ? echo "$(date): Old remote backups deleted successfully" >> "${log_file}"
else
? ? echo "$(date): Old remote backups deletion failed" >> "${log_file}"
fi
echo "$(date): MySQL cleanup and backup completed." >> "${log_file}"
chmod +x auto_mysqldump.sh
----定時執行
crontab -e
#*/2 * * * * /backup/script/auto_mysqldump.sh ? #每兩分鐘同步一次,測試用
0 2 * * * * /backup/script/auto_mysqldump.sh ? #實際使用,每天晚上2點鐘更新
----驗證查看
mysql服務器:
ls /backup/mysql/
hot_backup-2025-03-31.sql
遠程服務器:
ls /store/mysql
hot_backup-2025-03-31.sql
----刪除測試
1.navicat登錄mysql數據庫刪除一個庫,例如test庫。
2.還原
mysql -uroot -p
source /backup/mysql/hot_backup-2025-03-31.sql
------------------------------全量+增量,兩個腳本不一樣,直接復制
vim auto_mysqldump.sh
#!/bin/bash
# 設置環境變量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
# 獲取當前日期
DATE="$(date +%F)"
# 本地備份目錄
local_backup_dir=/backup/mysql
mkdir -p "${local_backup_dir}"
# 日志文件路徑
log_file="/backup/logs/mysql_backup.log"
mkdir -p "$(dirname "${log_file}")"
# 遠程服務器信息
REMOTE_SERVER="136node" ?# 替換為遠程服務器的IP地址或主機名
REMOTE_DIR="/store/mysql" ?# 替換為遠程服務器的備份目錄
REMOTE_SSH_PORT=22 ?# 替換為遠程服務器的SSH端口
# MySQL配置
MYSQL_LOGIN_PATH="backup" ?# 使用 mysql_config_editor 設置的登錄路徑
SOCKET_FILE="/data/mysql/mysql.sock" ?# MySQL 套接字文件路徑
# 清理二進制日志
echo "$(date): Cleaning up binary logs..." >> "${log_file}"
mysql --login-path=${MYSQL_LOGIN_PATH} --socket=${SOCKET_FILE} -e "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 30 DAY;" >> "${log_file}" 2>&1
# 清理錯誤日志
echo "$(date): Cleaning up error log..." >> "${log_file}"
ERROR_LOG="/var/log/mysql/error.log"
if [ -f "$ERROR_LOG" ]; then
? ? cat /dev/null > $ERROR_LOG
? ? echo "$(date): Error log cleaned." >> "${log_file}"
else
? ? echo "$(date): Error log not found." >> "${log_file}"
fi
# 清理慢查詢日志
echo "$(date): Cleaning up slow query log..." >> "${log_file}"
SLOW_QUERY_LOG="/var/log/mysql/mysql-slow.log"
if [ -f "$SLOW_QUERY_LOG" ]; then
? ? cat /dev/null > $SLOW_QUERY_LOG
? ? echo "$(date): Slow query log cleaned." >> "${log_file}"
else
? ? echo "$(date): Slow query log not found." >> "${log_file}"
fi
# 執行 MySQL 熱備份
echo "$(date): Performing MySQL hot backup..." >> "${log_file}"
mysqldump --login-path=${MYSQL_LOGIN_PATH} --socket=${SOCKET_FILE} --all-databases > "${local_backup_dir}/hot_backup-${DATE}.sql"
if [ $? -eq 0 ]; then
? ? echo "$(date): MySQL hot backup completed successfully" >> "${log_file}"
else
? ? echo "$(date): MySQL hot backup failed" >> "${log_file}"
? ? exit 1
fi
# 使用 rsync 同步本地備份文件到遠程服務器
echo "$(date): Syncing backup files to remote server using rsync..." >> "${log_file}"
rsync -vzrtopg --progress --delete -e "ssh -p ${REMOTE_SSH_PORT}" "${local_backup_dir}/" "${REMOTE_SERVER}:${REMOTE_DIR}/" >> "${log_file}" 2>&1
if [ $? -eq 0 ]; then
? ? echo "$(date): Backup files synced successfully" >> "${log_file}"
else
? ? echo "$(date): Backup files sync failed" >> "${log_file}"
? ? exit 1
fi
# 刪除本地舊的備份文件(保留最近30天的備份)
echo "$(date): Deleting old local backups..." >> "${log_file}"
find "${local_backup_dir}" -name "hot_backup-*.sql" -mtime +30 -delete
if [ $? -eq 0 ]; then
? ? echo "$(date): Old local backups deleted successfully" >> "${log_file}"
else
? ? echo "$(date): Old local backups deletion failed" >> "${log_file}"
fi
# 在遠程服務器上刪除舊的備份文件(保留最近30天的備份)
echo "$(date): Deleting old remote backups..." >> "${log_file}"
ssh -p ${REMOTE_SSH_PORT} "${REMOTE_SERVER}" "find ${REMOTE_DIR} -name 'hot_backup-*.sql' -mtime +30 -delete" >> "${log_file}" 2>&1
if [ $? -eq 0 ]; then
? ? echo "$(date): Old remote backups deleted successfully" >> "${log_file}"
else
? ? echo "$(date): Old remote backups deletion failed" >> "${log_file}"
fi
# 執行 MySQL 增量備份
echo "$(date): Performing MySQL incremental backup..." >> "${log_file}"
INCREMENTAL_BACKUP_DIR="${local_backup_dir}/incremental"
mkdir -p "${INCREMENTAL_BACKUP_DIR}"
# 創建增量備份目錄
INCREMENTAL_BACKUP_FILE="${INCREMENTAL_BACKUP_DIR}/incremental_backup-${DATE}.sql"
mysqldump --login-path=${MYSQL_LOGIN_PATH} --socket=${SOCKET_FILE} --single-transaction --master-data=2 --flush-logs --all-databases > "${INCREMENTAL_BACKUP_FILE}"
if [ $? -eq 0 ]; then
? ? echo "$(date): MySQL incremental backup completed successfully" >> "${log_file}"
else
? ? echo "$(date): MySQL incremental backup failed" >> "${log_file}"
? ? exit 1
fi
# 使用 rsync 同步增量備份文件到遠程服務器
echo "$(date): Syncing incremental backup files to remote server using rsync..." >> "${log_file}"
rsync -vzrtopg --progress --delete -e "ssh -p ${REMOTE_SSH_PORT}" "${INCREMENTAL_BACKUP_DIR}/" "${REMOTE_SERVER}:${REMOTE_DIR}/incremental/" >> "${log_file}" 2>&1
if [ $? -eq 0 ]; then
? ? echo "$(date): Incremental backup files synced successfully" >> "${log_file}"
else
? ? echo "$(date): Incremental backup files sync failed" >> "${log_file}"
? ? exit 1
fi
# 刪除本地舊的增量備份文件(保留最近30天的備份)
echo "$(date): Deleting old local incremental backups..." >> "${log_file}"
find "${INCREMENTAL_BACKUP_DIR}" -name "incremental_backup-*.sql" -mtime +30 -delete
if [ $? -eq 0 ]; then
? ? echo "$(date): Old local incremental backups deleted successfully" >> "${log_file}"
else
? ? echo "$(date): Old local incremental backups deletion failed" >> "${log_file}"
fi
# 在遠程服務器上刪除舊的增量備份文件(保留最近30天的備份)
echo "$(date): Deleting old remote incremental backups..." >> "${log_file}"
ssh -p ${REMOTE_SSH_PORT} "${REMOTE_SERVER}" "find ${REMOTE_DIR}/incremental -name 'incremental_backup-*.sql' -mtime +30 -delete" >> "${log_file}" 2>&1
if [ $? -eq 0 ]; then
? ? echo "$(date): Old remote incremental backups deleted successfully" >> "${log_file}"
else
----驗證查看
mysql服務器:
ls /backup/mysql/
hot_backup-2025-03-31.sql#全量文件 ? increxxx.sql#增量文件
遠程服務器:
ls /store/mysql
hot_backup-2025-03-31.sql
----刪除測試
1.navicat登錄mysql數據庫刪除一個庫,例如test庫。
2.還原
mysql -uroot -p
source /backup/mysql/hot_backup-2025-03-31.sql ?#先還原全量文件
假設你有多個增量備份文件,需要按時間順序依次應用它們。例如:
mysql -u root -p < /backup/mysql/incremental/incremental_backup-2024-07-31.sql
mysql -u root -p < /backup/mysql/incremental/incremental_backup-2024-08-01.sql
mysql -u root -p < /backup/mysql/incremental/incremental_backup-2024-08-02.sql
其他:腳本錯誤路徑:tail -f /var/spool/mail/root?
================!!!!!!!!!!!!!!更換data目錄,不要默認的,不然更新mysql的時候,data所有數據會被覆蓋消失=================
#直接把腳本粘貼上去把,免得錯了
mkdir -p /data/mysql
chown mysql:mysql -R /data/mysql
cp -R /var/lib/mysql/* /data/mysql/
1.my.cnf配置文件的datadir,socket,log-bin目錄也要切換為/data/mysql目錄下
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid
log_bin=/data/mysql/mysql-bin
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
2.腳本里的socket路徑更改/data/mysql/
SOCKET_FILE="/data/mysql/mysql.sock"
systemctl restart mysqld
#還有報錯查看
tail -f /var/spool/mail/root
journalctl -xe | grep mysqld