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 準確跟蹤上次備份之後被修改頁面,僅增備這些頁面,效率最快。







2016年12月23日 星期五

Oracle Database 12c Release 1 (12.1) Multitenant: Oracle Pluggable Database

Using DBMS_PDB:

最近研究下Oracle 12c中的新特性,下面主要是記錄 convert non-cdb to cdb

1. orcl is non-cdb database
2. orclcdb is cdb database

可以先建立好 CDB 空殼即可

SQL> select name,CDB from v$database;
NAME      CDB
--------- ---
orclcdb      YES

SQL> select name,CDB from v$database;
NAME      CDB
--------- ---
orcl      NO

[oracle@oracle12c ~]$ echo $ORACLE_SID
orcl
[oracle@oracle12c ~]$ sqlplus  / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 23 11:39:18 2016
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup open read only;
ORACLE instance started.

Total System Global Area 2315255808 bytes
Fixed Size                  2926952 bytes
Variable Size            1409287832 bytes
Database Buffers          889192448 bytes
Redo Buffers               13848576 bytes
Database mounted.
Database opened.



Datafile Location
SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u02/oradata/orcl/system01.dbf
/u02/oradata/orcl/gp_data01.dbf
/u02/oradata/orcl/sysaux01.dbf
/u02/oradata/orcl/undotbs01.dbf
/u02/oradata/orcl/gerp01.dbf
/u02/oradata/orcl/users01.dbf
/u02/oradata/orcl/perfstat.dbf
/u02/oradata/orcl/data_03.dbf
/u02/oradata/orcl/duty_03.dbf
/u02/oradata/orcl/duty_01.dbf
/u02/oradata/orcl/gerp02.dbf
/u02/oradata/orcl/data_02.dbf
/u02/oradata/orcl/users02.dbf
/u02/oradata/orcl/users03.dbf
/u02/oradata/orcl/users04.dbf
/u02/oradata/orcl/users05.dbf
/u02/oradata/orcl/users06.dbf
/u02/oradata/orcl/users07.dbf
/u02/oradata/orcl/users08.dbf
/u02/oradata/orcl/users09.dbf
/u02/oradata/orcl/data_01.dbf
/u03/oraindx/orcl/indx01.dbf
/u03/oraindx/orcl/indx02.dbf
/u02/oradata/orcl/duty_02.dbf

24 rows selected.



使用DBMS_PDB.DESCRIBE  non-CDB    創建 XML 描述文件。
SQL> BEGIN
  DBMS_PDB.DESCRIBE(
    pdb_descr_file => '/cdb/orcl.xml');      --> 此路徑自己設定
END;
/
PL/SQL procedure successfully completed.



Execute the Plug In Check and check PDB_PLUG_IN_VIOLATIONS when the result of the plug in check is
"NO":
SQL> SET SERVEROUTPUT ON
DECLARE
compatible CONSTANT VARCHAR2(3) := CASE
DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/cdb/orcl.xml',
pdb_name => 'pdborcl2')
WHEN TRUE THEN 'YES' ELSE 'NO'
END;
BEGIN
DBMS_OUTPUT.PUT_LINE(compatible);
END;
/

PL/SQL procedure successfully completed.

select message, type, status from pdb_plug_in_violations where type like '%ERR%';


Shutdown the non-CDB database.
export ORACLE_SID=orcl
sqlplus / as sysdba
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.



連接到 CDB 並使用 non-CDB 描述數據庫的XML文件創建新的PDB。 請記得配置FILE_NAME_CONVERT參數將現有文件轉換為新位置。
[oracle@oracle12c ~]$ export ORACLE_SID=orclcdb
[oracle@oracle12c ~]$ echo $ORACLE_SID
orclcdb

sqlplus / as sysdba

SQL> CREATE PLUGGABLE DATABASE pdborcl USING '/cdb/orcl.xml'
COPY
FILE_NAME_CONVERT = ('/u02/oradata/orcl/','/cdb/oradata/orclcdb/pdborcl/','/u03/oraindx/orcl/','/cdb/oradata/orclcdb/pdborcl/');

Pluggable database created.

切換到 PDB container 並且執行 "$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql" script 
ALTER SESSION SET CONTAINER=pdborcl;

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

開啟 PDB 並且確認
ALTER SESSION SET CONTAINER=pdborcl;
ALTER PLUGGABLE DATABASE OPEN;

SQL> SELECT name, open_mode FROM v$pdbs;

NAME                           OPEN_MODE
------------------------------ ----------
PDBORCL                        READ WRITE

1 row selected.

SQL>

確認目前狀態沒問題,最好備份一次。
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         3 PDBORCL                        READ WRITE NO

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE

1 row selected.

SQL> select name, CDB from v$database;

NAME      CDB
--------- ---
ORCLCDB   YES

1 row selected.

2015年11月25日 星期三

nfs server step

Server 端

Using NFS to Share Files

NFS (Network File System) is another way of sharing files across a network. It is used primarily in Linux and UNIX systems, although there are NFS clients for Windows.

Installing NFS

1. Use the following command to install NFS:
   rpm -qa nfs-utils nfs-utils-lib 檢查有無安裝 NFS Package
 
   or

   yum -y install nfs-utils nfs-utils-lib

Configuring NFS

Configuration of NFS is pretty simple. You add the directories you wish to export to the file /etc/exports.

2. Create a directory called /public with the following command:

   mkdir -p /u01/app/oracle/oradata/arch

3. Next, edit the file /etc/exports:

   vi /etc/exports

4. Add the following line to /etc/exports:
   
   ex: /public    *(ro,sync)

   /u01/app/oracle/oradata/arch 10.1.1.59(rw,no_root_squash,no_all_squash,sync)

5. Mount
   [root@standby ~]# exportfs -r 重新掛載 /etc/exports 裡面的設定
   [root@standby ~]# exportfs -v
   /u01/app/oracle/oradata/arch 10.1.1.59(rw,wdelay,no_root_squash,no_subtree_check,anonuid=65534,anongid=65534)
   [root@standby ~]# showmount -e localhost
   Export list for localhost:
   /u01/app/oracle/oradata/arch 10.1.1.59

Then, start the nfs server:

        /etc/rc.d/init.d/nfs start

Client 端

確認是否有 server 端是否有提供 NFS 掛載
[root@primary ~]$ showmount -e 10.1.1.60
Export list for 10.1.1.60:
/u01/app/oracle/oradata/arch 10.1.1.59

--add parameter
vim /etc/fstab
10.1.1.60:/u01/app/oracle/oradata/arch    /u01/app/oracle/oradata/arch               nfs     rw              0 0

手動 mount
# mount -t nfs 10.1.1.60:/u01/app/oracle/oradata/arch /u01/app/oracle/oradata/arch

若 alert log file 出現下面錯誤訊息
ORA-27086: unable to lock file - already in use
Linux-x86_64 Error: 37: No locks available
Additional information: 10

解决方法:掛載時使用 nolock 參數
# umount /u02/arch/
# mount -o nolock -t nfs 10.1.1.60:/backup/arch /u02/arch/