Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्या mysqldump बाइनरी डेटा को मज़बूती से संभालता है?

नहीं, जब आपके पास बाइनरी ब्लॉब्स हों तो यह हमेशा विश्वसनीय नहीं होता है। उस स्थिति में आपको "--hex-blob . का उपयोग करना होगा " सही परिणाम प्राप्त करने के लिए ध्वजांकित करें।

नीचे टिप्पणी से चेतावनी:

मेरे पास एक ऐसा मामला है जहां ये कॉल विफल हो जाते हैं (एक अलग सर्वर पर आयात करना लेकिन दोनों Centos6/MariaDB 10 चल रहे हैं):

mysqldump --single-transaction --routines --databases myalarm -uroot -p"PASSWORD" | gzip > /FILENAME.sql.gz
gunzip < FILENAME.sql.gz | mysql -p"PASSWORD" -uroot --comments

यह एक फाइल तैयार करता है जो चुपचाप आयात करने में विफल रहता है। "-स्किप-विस्तारित-सम्मिलित करें" जोड़ने से मुझे एक फ़ाइल मिलती है जो डीबग करना बहुत आसान है, और मुझे लगता है कि यह लाइन जेनरेट की गई है लेकिन पढ़ा नहीं जा सकता है (लेकिन निर्यात या आयात करने में कोई त्रुटि रिपोर्ट नहीं की गई है):

INSERT INTO `panels` VALUES (1003,1,257126,141,6562,1,88891,'??\\\?ŖeV???,NULL);

ध्यान दें कि बाइनरी डेटा पर टर्मिनेटिंग कोट मूल में मौजूद नहीं है।

select hex(packet_key) from panels where id=1003;
--> DE77CF5C075CE002C596176556AAF9ED

कॉलम बाइनरी डेटा है:

CREATE TABLE `panels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  `serial_number` int(10) unsigned NOT NULL,
  `panel_types_id` int(11) NOT NULL,
  `all_panels_id` int(11) NOT NULL,
  `installers_id` int(11) DEFAULT NULL,
  `users_id` int(11) DEFAULT NULL,
  `packet_key` binary(16) NOT NULL,
  `user_deleted` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  ...

तो नहीं, न केवल आप जरूरी नहीं कि mysqldump पर भरोसा कर सकते हैं, जब कोई त्रुटि होती है तो आप उस पर भरोसा भी नहीं कर सकते हैं।

मेरे द्वारा उपयोग किया जाने वाला एक बदसूरत कामकाज डंप में इस तरह के विकल्पों को जोड़कर दो पीड़ित तालिकाओं को छोड़कर mysqldump था:

--ignore-table=myalarm.panels 

फिर यह BASH स्क्रिप्ट हैक। मूल रूप से एक चयन चलाएं जो INSERT मान उत्पन्न करता है जहां नल कॉलम संभाले जाते हैं और बाइनरी कॉलम यूएनएचईएक्स() कॉल में बदल जाता है:

(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL),

जरूरत पड़ने पर इसके साथ खेलने के लिए इसे अपने पसंद के संपादक में पेस्ट करें।

echo "SET UNIQUE_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;DELETE FROM panels;INSERT INTO panels VALUES " > all.sql
mysql -uroot -p"PASSWORD" databasename -e "SELECT CONCAT('(',id,',', enabled,',', serial_number,',', panel_types_id,',', all_panels_id,',', IFNULL(CONVERT(installers_id,CHAR(20)),'NULL'),',', IFNULL(CONVERT(users_id,CHAR(20)),'NULL'), ',UNHEX(\"',HEX(packet_key),'\"),', IF(ISNULL(user_deleted),'NULL',CONCAT('\"', user_deleted,'\"')),'),') FROM panels" >> all.sql
echo "SET UNIQUE_CHECKS=1;SET FOREIGN_KEY_CHECKS=1;" > all.sql

यह मुझे "all.sql" नामक एक फ़ाइल देता है जिसे INSERT में अंतिम अल्पविराम की आवश्यकता होती है, जिसे अर्धविराम में बदल दिया जाता है, फिर इसे ऊपर के रूप में चलाया जा सकता है। मुझे उस फ़ाइल को संसाधित करने के लिए इंटरएक्टिव mysql शेल और कमांड लाइन दोनों में "बड़े आयात बफर" सेट की आवश्यकता थी क्योंकि यह बड़ी है।

mysql ... --max_allowed_packet=1GB

जब मैंने बग की सूचना दी तो मुझे अंततः "--हेक्स-ब्लॉब" ध्वज की ओर इशारा किया गया, जो मेरे कामकाज के समान ही है लेकिन मेरी तरफ से एक छोटा सा है। उस विकल्प को जोड़ें, बूँदें हेक्स, अंत के रूप में डंप हो जाती हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. उच्च उपलब्धता के लिए MySQL के लिए Percona सर्वर कैसे परिनियोजित करें

  2. MySQL:समूह फ़ंक्शन का अमान्य उपयोग

  3. मीडिया स्टोर से किसी एक फाइल को कैसे डिलीट करें?

  4. Mysqldump का उपयोग करके एकल MySQL तालिका को कैसे पुनर्स्थापित करें?

  5. SQL ALTER DATABASE Syntax - DBMS द्वारा सूचीबद्ध