2022年9月15日 星期四

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.