Thursday, November 27, 2014

Mysqlbinlog बिंदु में समय-वसूली उदाहरण के साथ खो दिया है MySQL डेटा की वसूली

Original post: http://anothermysqldba.blogspot.com/2014/11/recover-lost-mysql-data-with.html

बैकअप ... बैकअप ... बैकअप ... लेकिन निश्चित रूप से .. आप भी अक्सर अन्यथा वे बेकार हो सकता है उन लोगों के बैकअप की निगरानी और परीक्षण की जरूरत है। अपने MySQL होने binlogs निश्चित रूप से और साथ ही एक आपातकालीन स्थिति के बार में आप मदद कर सकते हैं सक्षम होना चाहिए। MySQL के binlogs अक्सर MySQL के प्रतिकृति के संबंध में संदर्भित कर रहे हैं, एक अच्छे कारण के लिए, वे डेटा (बदल कि प्रश्नों या घटनाओं के सभी स्टोर पंक्ति आधारितएक छोटे से अलग है, लेकिन यह एक उदाहरण है)। वे उपलब्ध कराने वसूली विकल्पों पर विचार जब binlogs सर्वर के प्रदर्शन पर बहुत कम प्रभाव पड़ता है। 


[anothermysqldba]> show variables like 'log_bin%'; 
+---------------------------------+--------------------------------------------+ 
| Variable_name | Value | 
+---------------------------------+--------------------------------------------+ 
| log_bin | ON | 
| log_bin_basename | /var/lib/mysql/binlogs/mysql-binlogs | 
| log_bin_index | /var/lib/mysql/binlogs/mysql-binlogs.index | 

show variables like 'binlog_format%'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| binlog_format | MIXED | 
+---------------+-------+ 


तो यह एक binlog से डाटा को ठीक हैं और वापस डेटाबेस के लिए इसे लागू करने के लिए mysqlbinlog का उपयोग करते हुए सिर्फ एक सरल उदाहरण है। 

पहले हम ढीला करने के लिए कुछ की जरूरत है। कुछ हमारे डेटाबेस को कुछ नहीं करना था, तो हम डाटा को ठीक करने में सक्षम होने की जरूरत है या हो सकता है कि यह सिर्फ किसी गलती से उबरने के लिए एक तरीका है। 


CREATE TABLE `table_w_rdata` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`somedata` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
`moredata` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

हम यहाँ नाटक और हम डेवलपर्स / बहुत अच्छी तरह से संवाद स्थापित करने और / या उनके कोड की प्रतियां बचत नहीं कर रहे हैं कि DBAs है कि ग्रहण कर सकते हैं। 


delimiter // 
CREATE PROCEDURE populate_dummydata( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @A + (RAND() * @B ))) as somedata, SUBSTR(md5(''),FLOOR( @C + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 
call populate_dummydata(50); 

> SELECT NOW() \G 
*************************** 1. row *************************** 
NOW(): 2014-11-27 17:32:25 
1 row in set (0.00 sec) 

> SELECT * from table_w_rdata WHERE id > 45; 
+----+----------------------------+------------------+ 
| id | somedata | moredata | 
+----+----------------------------+------------------+ 
| 46 | b204e9800998ecf8427e | 0998ecf8427e | 
| 47 | d98f00b204e9800998ecf8427e | 8ecf8427e | 
| 48 | b204e9800998ecf8427e | 800998ecf8427e | 
| 49 | 98f00b204e9800998ecf8427e | e9800998ecf8427e | 
| 50 | 98f00b204e9800998ecf8427e | 998ecf8427e | 
+----+----------------------------+------------------+ 

एक प्रक्रिया बनाई गई है, जबकि इसे बाद में किसी और को गलत तरीके से किसी के द्वारा लिखा जाता है। 

DROP PROCEDURE IF EXISTS populate_dummydata ; 
delimiter // 
CREATE PROCEDURE populate_dummydata( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @C + (RAND() * @A ))) as somedata, SUBSTR(md5(''),FLOOR( @B + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 

call populate_dummydata(50); 
> SELECT NOW(); SELECT * from table_w_rdata WHERE id > 95; 
+---------------------+ 
| NOW() | 
+---------------------+ 
| 2014-11-27 17:36:28 | 
+---------------------+ 
1 row in set (0.00 sec) 

+-----+-------------------+---------------------+ 
| id | somedata | moredata | 
+-----+-------------------+---------------------+ 
| 96 | 4e9800998ecf8427e | 00998ecf8427e | 
| 97 | 9800998ecf8427e | 800998ecf8427e | 
| 98 | e9800998ecf8427e | 204e9800998ecf8427e | 
| 99 | e9800998ecf8427e | 4e9800998ecf8427e | 
| 100 | 9800998ecf8427e | 04e9800998ecf8427e | 
+-----+-------------------+---------------------+ 


टीम चाहता था जैसे प्रक्रिया की प्रतिस्थापित संस्करण यादृच्छिक मूल्यों नहीं पैदा कर रहा है। प्रक्रिया के मूल निर्माता सिर्फ निराशा से बाहर निकलें। तो क्या करें?यह के रूप में अच्छी तरह से बनाया गया था के बाद से थोड़ा सा समय अतीत है। हम गलत प्रक्रिया बिन लॉग्स के आसपास अभी भी कर रहे हैं बनाया है और हमारे लिए भाग्यशाली था जब डेटाबेस का नाम, दिनचर्या नाम और सामान्य समय सीमा पता है, इसलिए हम इसे पाने के लिए जा सकते हैं। 

हम सिर्फ एक चाहते आसपास के बाद से एक सामान्य देख ले जाना है बिंदु में समय-वसूली इस procedure.We की प्रक्रिया और पहले और बाद binlog में स्थिति को खोजने के लिए होता है। 


NOW(): 2014-11-27 19:46:17 
# mysqlbinlog --start-datetime=20141127173200 --stop-datetime=20141127173628 --database=anothermysqldba mysql-binlogs.000001 | more 

at 253053 
at 253564 

# mysql anothermysqldba --login-path =local -e "DROP PROCEDURE populate_dummydata"; 
# mysqlbinlog --start-position=253053 --stop-position=253564 --database=anothermysqldba mysql-binlogs.000001 | mysql --login-path =local anothermysqldba 


> SHOW CREATE PROCEDURE populate_dummydata\G 
*************************** 1. row *************************** 
Procedure: populate_dummydata 
sql_mode: NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `populate_dummydata`( IN rowsofdata INT ) 
BEGIN 

SET @A = 3; 
SET @B = 15 - @A; 
SET @C = 16; 
SET @D = 25 - @C; 

WHILE rowsofdata > 0 DO 
INSERT INTO table_w_rdata 
SELECT NULL, SUBSTR(md5(''),FLOOR( @A + (RAND() * @B ))) as somedata, SUBSTR(md5(''),FLOOR( @C + (RAND() * @D ))) AS moredata ; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END 
character_set_client: utf8 
collation_connection: utf8_general_ci 
Database Collation: latin1_swedish_ci 
1 row in set (0.00 sec) 

NOW(): 2014-11-27 19:51:03 
> call populate_dummydata(50); 
> SELECT * from table_w_rdata WHERE id > 145; 
+-----+-----------------------------+------------------+ 
| id | somedata | moredata | 
+-----+-----------------------------+------------------+ 
| 146 | 98f00b204e9800998ecf8427e | 800998ecf8427e | 
| 147 | cd98f00b204e9800998ecf8427e | 800998ecf8427e | 
| 148 | 204e9800998ecf8427e | 98ecf8427e | 
| 149 | d98f00b204e9800998ecf8427e | e9800998ecf8427e | 
| 150 | 204e9800998ecf8427e | 9800998ecf8427e | 
+-----+-----------------------------+------------------+ 


हम के माध्यम से बाइनरी प्रवेश से हमारे प्रक्रिया बरामद बिंदु में समय-वसूली  
यह एक सरल उदाहरण है, लेकिन इसे आप आगे बढ़ने का उपयोग कर सकते हैं उपकरणों का एक उदाहरण है। 

Binlogs इतना मूल्यवान हैं यही कारण है। 

सहायक यूआरएल: 

No comments:

Post a Comment