2022年9月16日 星期五

Linux 伺服器傳文件或檔案不用輸密碼

在Linux環境下,兩台主機之間傳輸文件一般使用scp命令,通常用scp命令通過

ssh獲取對方linux主機文件的時候都需要輸入密碼確認,不過通過建立信任關係,可以實現不輸入密碼。

這裡假設A的IP:10.0.0.1、B的IP:10.0.0.2

需要從A免密碼輸入複製文件至B。

1. 在主機A上執行如下命令來生成配對密鑰: 

ssh-keygen -t rsa

按照提示操作,注意,不要輸入passphrase。提示信息如下 

Generating public/private rsa key pair. 

Enter file in which to save the key (/root/.ssh/id_rsa): 

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 

Your identification has been saved in /root/.ssh/id_rsa. 

Your public key has been saved in /root/.ssh/id_rsa.pub. 

The key fingerprint is: 

ff:8e:85:68:85:94:7c:2c:46:b1:e5:2d:41:5c:e8:9b root@localhost.domain 


2. 將 .ssh 目錄中的 id_rsa.pub 文件複製到 主機B 的 ~/.ssh/ 目錄中,並改名為 authorized_keys。 
scp .ssh/id_rsa.pub 10.0.0.2:/root/.ssh/authorized_keys 

以後從A主機scp到B主機就不需要密碼了。

3.使用此方法需要注意:複製的兩台伺服器需要用相同帳戶,這裡都是用的root。為了安全起見,需要在兩台機器中創建相同的賬號,然後在A上用su命令切換至賬號下,執行第1步,第二步中複製文件時可能.ssh目錄並不存在,需要手動創建。

mkdir ~/.ssh

在第2步中如果機器中已經存在 authorized_keys 文件,則需注意,這個文件可以包含多個SSH驗證信息,這時可用 cat >> 命令將驗證文件內容附加上去。

範例複製到 

scp .ssh/id_rsa.pub 10.0.0.2:/root/.ssh/a.pub    -- root 

scp .ssh/id_rsa.pub 10.0.0.2:/home/oracle/.ssh/authorized_keys  -- oracle

然後登入到 10.0.0.2 執行 cat ~/.ssh/a.pub >> ~/.ssh/authorized_keys


MySQL rsync binlog & 補上 binlog

同步 MySQL binlog 到其他主機保存 

#rsync_binlog.sh#

cat /usr/local/shell/rsync_binlog.sh

#!/bin/bash
while true
do
  rsync -az /mnt1/mysql-data/mysql-bin.* 192.168.0.106:/backup/bin &
  sleep 30
done


mysql 二進制日誌有三種格式:statement、row、mixed
一般我會採用格式是mixed。這種格式兼具了基於行(row) 和基於語句(statement) 的優點。
但是在使用mysqlbinlog 查看混合模式的二進製文件時,需要用 base64 編碼顯示 
--base64 -output參數用來控制 binlog 部分是否顯示出來的

查看 row 模式的 binlog 方式如下:

mysqlbinlog --base64-output=decode-rows -v /backup/bin/mysql-bin.000021 | more


相關參數

# 參數:--start-datetime,--stop-datetime,--start-position,--stop-position,--database

接下來,您必須從保存在 mysql-bin.000021 文件中的二進制日誌中恢復數據。

運行以下命令恢復增量備份。

mysqlbinlog --base64-output=decode-rows -v /backup/bin/mysql-bin.000021 | mysql -uroot -p

or

mysqlbinlog --base64-output=decode-rows -vv /backup/bin/mysql-bin.000021 | mysql -uroot -p


##--start-position##
要補上 binlog 時,必須要先查看完整備份日誌。
日誌如下: 截斷為 39151181

cat /backup/MEB_20220918/meta/MEB_2022-09-18.12-00-02.log | more


Truncating binary log to '/backup/MEB_20220918/datadir/mysql-bin.000084':39151181



那我們就從下一個開始補
mysqlbinlog --base64-output=decode-rows -vv --start-position=39151260 /backup/bin/mysql-bin.000084 | mysql -uroot -p







2022年9月15日 星期四

MySQL table & row Lock

MySQL 要幹掉一個 process 是這樣搞的

mysql> show processlist;

---------------------------------

mysql> kill 1234;

或者是

mysqladmin processlist

mysqladmin kill 1234;


1、通過下面語法查詢到交易的資料,kill 掉此執行緒即可。

select * from information_schema.innodb_trx;

2、增加鎖等待時間,即增大下面配置項引數值,單位為秒(s)

innodb_lock_wait_timeout=500

mysql> show processlist;


show processlist 看不出來是否有 lock 的狀態

mysql> select * from information_schema.innodb_trx;

使用此語法可以查出有哪些是 row lock

mysql> kill 1277;

Query OK, 0 rows affected (0.00 sec)

mysql> kill 737;

Query OK, 0 rows affected (0.00 sec)


mysql> select * from information_schema.innodb_trx;

Empty set (0.00 sec)

MySQL(MEB) Backup & Restore

 MySQL(MEB) Backup & Restore

最近使用了企業版MySQL,發現有很多改變。
新增了 mysql enterprise monitor、MySQL企業版備份工具(MEB)   MySQL Enterprise Backup
這篇文章先來講   MySQL Enterprise Backup(MEB) 。
對資料庫管理者來說,備份跟還原是很重要的,如果資料發生遺失,會造成很大的後果,甚至造成公司有很大的損失。
做備份排程之前,必須要考慮到備份的週期是不是系統能承受的恢復時間,也要避免在系統忙碌的時候做備份。

MySQL Enterprise Backup   工具

MEB 可以備份所有儲存引擎,備份能夠壓縮或驗證備份檔、還原的速度非常的快。

MEB 備份分為三種類型,分為full backup(完整備份)different backup(差異備份)incremental backup(增量備份)

  • 完整備份:備份完整的資料。
  • 差異備份:備份上一次完整備份到現在的資料變化,還原時必須先還原上一次完整備份,再還原差異備份的資料。
  • 增量備份:備份上一次備份(完整、差異、增量)到現在的資料變化,在還原時必須依序的還原回來。
備份操作可以參考官網:
https://dev.mysql.com/doc/mysql-enterprise-backup/8.0/en/backup-commands.html

MySQL Full Backup

mysqlbackup --user=root --password=xxxx --socket=/mnt1/mysql-data/mysql.sock --limit-memory=1024 --read-threads=2 --process-threads=5 --write-threads=2 --no-locking=true --backup-image=/backup/MEB_`date +%Y%m%d`/full.mbi  --backup-dir=/backup/MEB_`date +%Y%m%d` backup-to-image

MySQL incrementall Backup

mysqlbackup --user=root --password=xxxx --socket=/mnt1/mysql-data/mysql.sock --limit-memory=1024 --read-threads=2 --process-threads=5 --write-threads=2 --no-locking=true --incremental --incremental-base=history:last_backup --backup-dir=/backup/INCR_`date +%Y%m%d` --backup-image=inc_bak.mbi --with-timestamp backup-to-image

 PS:  incremental-base=history:last_backup 直接使用 history:last_backup 代替上一次的備份,省去人工尋找目錄的麻煩,MEB會自動到 backup_history 表中查找上一次備份的目錄。

#Restore image#

先還原全備,還原資料庫備份之前必須做完成以下步驟:

  1. 關閉 mysqld 服務
  2. 清空 mysql datadir 目錄

 

還原全備

mysqlbackup --defaults-file=/etc/my.cnf --limit-memory=1024 --read-threads=10 --process-threads=15 --write-threads=10 --datadir=/mnt/mysql-data --backup-image=/backup/MEB/full.mbi --backup-dir=/backup/restore-tmp copy-back-and-apply-log

 

還原增備

mysqlbackup --defaults-file=/etc/my.cnf --limit-memory=1024 --read-threads=10 --process-threads=15 --write-threads=10 --backup-image=/backup/INCR_20220912/2022-09-12_12-00-01/inc_bak.mbi --backup-dir=/backup/restore-tmp_`date +%Y%m%d` --datadir=/mnt/mysql-data --incremental copy-back-and-apply-log

多個增量還原,只需要多次執行上面的命令即可。

注意 --backup-image 每次都要用當前增量備份的目錄。


 後續研究  --incremental=page-track 參數

##Incremental Backup Using Page Tracking##

Install the mysqlbackup component, which comes with the MySQL Enterprise Server 8.0 installation, by running this command at a mysql client connected to the server:

INSTALL COMPONENT "file://component_mysqlbackup";


在全備前開啟page-track
Start page tracking with the following function:

SELECT mysqlbackup_page_track_set(true);


The LSN value starting from which changed pages have been tracked is returned by this function:

SELECT mysqlbackup_page_track_get_start_lsn();


You can stop page tracking with the following function:

SELECT mysqlbackup_page_track_set(false);

資料來源: https://dev.mysql.com/doc/mysql-enterprise-backup/8.0/en/mysqlbackup.incremental.html#mysqlbackup.page-tracking.incremental


##MySQL --incremental=page-track 增量備份##

mysqlbackup --user=root --password=xxxx --socket=/mnt1/mysql-data/mysql.sock --limit-memory=1024 --read-threads=2 --process-threads=5 --write-threads=2 --no-locking=true -- --incremental=page-track --incremental-base=history:last_backup --backup-dir=/backup/INCR_`date +%Y%m%d` --backup-image=inc_bak.mbi backup-to-image

使用了 incremental=page-track 這參數
利用 LSN 準確跟蹤上次備份之後被修改頁面,僅增備這些頁面,效率最快。