linux數據庫備份和恢復


一、直接用log日志備份

(注:操作前先停止網站數據再次進入,生成新的SQL語句)

1、查看所有數據庫操作語句
/usr/local/mysql/bin/mysqlbinlog --no-defaults mysql-bin.000010 > /opt/backup/aaa.sql

2、恢復(設置截止時間或截止id)
mysqlbinlog --database=test --stop-datatime="2017-12-08 15:03:00" /usr/local/mysql/var/mysql-bin.000011 | mysql -u root -p
二、做主從備份
http://blog.csdn.net/qmhball/article/details/8233769

(注:下文為引入,防止原文件刪除)
主機(master)配置:
1.修改mysql配置文件my.cnf
在[mysqld]標簽下添加以下幾行

[plain]  view plain  copy
 
  1. log-bin #開啟二進制日志  
  2. server-id=id #主服務器id號  
  3. binlog-do-db=db_nameA #指定對db_nameA記錄二進制日志  
  4. binlog-ignore-db=db_namB #指定不對db_namB記錄二進制日志  

注意:
log-bin,server-id是配置文件中必須添加的內容。此時主服務器默認對所有數據庫進行備份。如果需要特殊指明只對某個數據庫進行備份或不備份,則可以加入binlog-do-db和binlog-ignore-db選項。有關(log-bin的詳細說明見附錄1)

在測試主機上,我們實際添加入如下內容:

[plain]  view plain  copy
 
  1. log-bin  
  2. server-id=1  
  3. binlog-do-db=test  


2.為從服務器添加mysql賬戶並配置權限
在主服務器上,必須為從服務器創建一個用來連接主服務器的用戶,並設置replication slave權限。所用具體命令如下:

[sql]  view plain  copy
 
  1. grant replication slave  
  2. on *.*  
  3. to '帳號' @ '從服務器IP' identified by '密碼';  

在測試機上,我們實際執行:

[sql]  view plain  copy
 
  1. grant replication slave  
  2. on *.*  
  3. to 'replication'@'%' identified by 'sosotest';  

這時在mysql庫的user表中使用

[sql]  view plain  copy
 
  1. select * from user where user = 'replication' \G;  

可以看到Repl_slave_priv項對就的值為Y。
3.導出主服務器數據
導出主服務器數據,以備之后將其導入從服務器,使主從服務器的初始狀態保持一致。

在測試機上,我們實際執行:

[sql]  view plain  copy
 
  1. mysqldump test > test.bak  


4.記錄File 及Position 項的值
  重啟mysql,使用show master status\G;查看主服務器狀態,記錄File 及Position 項的值,以便之后對從服務器進行配置。
  
在測試機上,我們實際執行時看到的結果如下:
*************************** 1. row ***************************
File: simba-bin.000008
Position: 79
Binlog_Do_DB: test
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

其中File為imba-bin.000008;Position為79。

至此主服務器配置完畢

從機(slave)配置:
1.修改mysql配置文件my.cnf
在[mysqld]標簽下添加以下面一行:

[plain]  view plain  copy
 
  1. server-id=id #從機id  

實際中,我們添加:

[plain]  view plain  copy
 
  1. server-id=2  


2.導入主機數據庫
在測試機上,我們實際執行:
mysql test < test.bak

3.重啟mysql數據庫並設置相關參數

[sql]  view plain  copy
 
  1. change master to  
  2. master_host = '10.1.146.133',  
  3. master_user = 'replication',  
  4. master_password = 'sosotest',  
  5. master_log_file = 'darkstar-bin.000008',  
  6. master_log_pos = 79;  
  7. slave start;  

4.檢查數據庫查看相關參數
  使用show slave status \G;查看相關參數是否正確。
  在實際執行時,我們在從機上看到的結果如下(只摘取了部分輸出):
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.146.133
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: darkstar-bin.000006
Read_Master_Log_Pos: 79
Relay_Log_File: simba-relay-bin.000003
Relay_Log_Pos: 171
Relay_Master_Log_File: darkstar-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……

對部分參數的解釋:
Slave_IO_State: Waiting for master to send event 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上參數說聽slave正常運行,正等待主服務器發來的消息。此時若用netstate命令可以看到從機與主機間已經建立了一條邊接。

特別需要注意的兩個參數是:
Master_Log_File和Read_Master_Log_Pos。Master_Log_File代表主機上用於主備同步的日志文件名,Read_Master_Log_Pos代表上一次成功同步到的日志文件中的位置。
如果這兩項與先前在主服務器上看到的File及Position的值不相符,則無法正確進行同步。

三、解決同步狀態的問題:
http://blog.51cto.com/kerry/277414

(注:下文為引入)

Slave_SQL_Running: No mysql同步故障解決
     今天檢查數據庫發現一台MySQL Slave未和主機同步,查看Slave狀態:
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
....
Seconds_Behind_Master:NULL
原因:
1.程序可能在slave上進行了寫操作 
2.也可能是slave機器重起后,事務回滾造成的.
解決辦法I:
1.首先停掉Slave服務:slave stop
2.到主服務器上查看主機狀態:
記錄File和Position對應的值。
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000020 | 135617781 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
3.到slave服務器上執行手動同步:
mysql> change master to 
> master_host='master_ip',
> master_user='user', 
> master_password='pwd', 
> master_port=3307, 
> master_log_file='mysql-bin.000020', 
> master_log_pos=135617781;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)
再次查看slave狀態發現:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0
解決辦法II:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
 
自己的使用體會:方法一是強制性從某一個點開始同步,會有部分沒有同步的數據丟失,后續主服務器上刪除記錄同步也會有一些錯誤信息,不會影響使用.方法二不一定會有效果.
 
 
=======================================================================================]
1,主從不能同步:
show slave status;報錯:Error xxx dosn't exist
且show slave status\G:
Slave_SQL_Running: NO
Seconds_Behind_Master: NULL
解決方法:
stop slave;
set global sql_slave_skip_counter =1 ;
start slave;
之后Slave會和Master去同步 主要看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master是否為0,0就是已經同步了
2,還需要做的一些優化與監視:
show full processlist; //查看mysql當前同步線程號
skip-name-resolve       //跳過dns名稱查詢,有助於加快連接及同步的速度
max_connections=1000    //增大Mysql的連接數目,(默認100)
max_connect_errors=100 //增大Mysql的錯誤連接數目,(默認10)
 

查看日志一些命令
1,  show master status\G;
           在這里主要是看log-bin的文件是否相同。
    show slave status\G;
    在這里主要是看:
                   Slave_IO_Running=Yes
                   Slave_SQL_Running=Yes
   如果都是Yes,則說明配置成功.
2,在master上輸入show processlist\G;
     mysql> SHOW PROCESSLIST\G
     *************************** 1. row ***************************
       Id: 2
       User: root
       Host: localhost:32931
       db: NULL
       Command: Binlog Dump
       Time: 94
       State: Has sent all binlog to slave; waiting for binlog to
         be updated
       Info: NULL
   如果出現Command: Binlog Dump,則說明配置成功.
 
 
stop slave    #停止同步 
start slave    #開始同步,從日志終止的位置開始更新。 
SET SQL_LOG_BIN=0|1  #主機端運行,需要super權限,用來開停日志,隨意開停,會造成主機從機數據不一致,造成錯誤 
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=n  # 客戶端運行,用來跳過幾個事件,只有當同步進程出現錯誤而停止的時候才可以執行。 
RESET MASTER  #主機端運行,清除所有的日志,這條命令就是原來的FLUSH MASTER 
RESET SLAVE   #從機運行,清除日志同步位置標志,並重新生成master.info
雖然重新生成了master.info,但是並不起用,最好,將從機的mysql進程重啟一下, 
LOAD TABLE tblname FROM MASTER #從機運行,從主機端重讀指定的表的數據,每次只能讀取一個,受timeout時間限制,需要調整timeout時間。執行這個命令需要同步賬號有 reload和super權限。以及對相應的庫有select權限。如果表比較大,要增加net_read_timeout 和 net_write_timeout的值 
LOAD DATA FROM MASTER  #從機執行,從主機端重新讀入所有的數據。執行這個命令需要同步賬號有reload和super權限。以及對相應的庫有select權限。如果表比較大,要增加net_read_timeout 和 net_write_timeout的值 
CHANGE MASTER TO master_def_list  #在線改變一些主機設置,多個用逗號間隔,比如
CHANGE MASTER TO
  MASTER_HOST='master2.mycompany.com',
  MASTER_USER='replication',
  MASTER_PASSWORD='bigs3cret' 
MASTER_POS_WAIT() #從機運行 
SHOW MASTER STATUS #主機運行,看日志導出信息 
SHOW SLAVE HOSTS #主機運行,看連入的從機的情況。 
SHOW SLAVE STATUS (slave) 
SHOW MASTER LOGS (master) 
SHOW BINLOG EVENTS [ IN 'logname' ] [ FROM pos ] [ LIMIT [offset,] rows ] 
PURGE [MASTER] LOGS TO 'logname' ; PURGE [MASTER] LOGS BEFORE 'date'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM