शनिवार, 11 अक्टूबर 2014

MySQL धीरे लॉग घूर्णन

Original post: http://anothermysqldba.blogspot.com/2014/10/rotating-mysql-slow-logs.html

विभिन्न ग्राहकों के साथ काम करते हुए मैं समय समय पर बहुत बड़ी धीमी गति से लॉग इन फ़ाइलों भर में चलाने के लिए होता है. वे घुमाया जाना चाहिए पर कई राय मौजूद हैं. इन विचारों से कई हालांकि मैं मेरे द्विआधारी लॉग फ्लश करने के लिए नहीं पसंद करते हैं, लॉग घुमाएँ और फ्लश लॉग आदेश का उपयोग करें.मैं रोनाल्ड ब्रैडफोर्ड के साथ सहमत हैं यही कारण है कि ब्लॉग पोस्ट यह कैसे करना है पर साल पहले से. 
मैं एक छोटे से आगे ले लिया और कदम की पटकथा लिखी है. पार्टी की योजना बनाई स्क्रिप्ट MySQL 5.6 के साथ बनाया गया है और मन में mysql_config_editor यह रूप में अच्छी तरह से MySQL के पुराने संस्करणों पर इस्तेमाल किया जा सकता है. 

स्क्रिप्ट निम्न करना होगा: 
  • मौजूदा लॉग फ़ाइल नाम इकट्ठा
  • वर्तमान लंबे क्वेरी समय मूल्य इकट्ठा
  • एक उच्च मूल्य के लिए लंबे क्वेरी समय रीसेट करता है
  • प्रतियां के रूप में अच्छी तरह से यह छोटा है, जबकि लॉग (रोनाल्ड की पोस्ट देखें)
  • मूल समय के लिए वापस लंबे क्वेरी समय रीसेट करता है
  • यदि आप चाहें तो एक साधारण धीमी क्वेरी ताकि आप नए धीमी लॉग जाँच कर सकते हैं कार्यान्वित
  • आप वापस अंतरिक्ष हासिल कर सकते हैं तो पुराने धीमी लॉग निकालता है.
    • आप के बजाय लॉग की समीक्षा करना चाहते हैं तो आप इस आदेश को बाहर टिप्पणी कर सकते हैं.
तो यह सब काम करता है? 
वैसे हम इस उदाहरण का उपयोग करते हैं. 

मैं तदनुसार स्क्रिप्ट अद्यतन इसलिए मैं वर्तमान में एक .my.cnf फ़ाइल पर mysql_config_editor उपयोग कर रहा हूँ. 
# mysql_config_editor print --all 
[local] 
user = root 
password = ***** 
host = localhost 

मैं इस धीमी क्वेरी लॉग अब 1G है कि देख सकते हैं. 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 1.1G Oct 11 16:08 mysql-slow.log 

इसलिए मैं स्क्रिप्ट निष्पादित 
# /root/rotate_slow_logs.sh 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 5.8K Oct 11 16:11 mysql-slow.log 

अच्छा ठीक है, यह काम किया है और मैं अपने बिन लॉग निस्तब्धता या MySQL शुरु बिना अब एक छोटे लॉग फ़ाइल है. 

आप जितनी बार आप चाहते हैं के रूप में बारी बारी से कर सकते हैं तो यह स्क्रिप्ट एक crontab में जोड़ा जा सकता है. 

यहाँ स्क्रिप्ट है. 
#!/bin/bash 

# THIS IS BUILT WITH MYSQL 5.6 SECURITY IN MIND. 
# SET THE LOGINPATHVALUE if you are using the mysql_config_editor 
# IF YOU ARE NOT USING THE mysql_config_editor THEN IT IS ASSUMED YOU HAVE 
# SET A .my.cnf FILE IN THE USER HOME DIR OR THIS USER HAS NO PASSWORD SET 


# PLEASE SET THIS ACCORDINGLY TO YOUR SYSTEM. 
LOGINPATHVALUE="local"; 

if [ -z "${LOGINPATHVALUE}" ]; then 
LOGINPATH=""; 
fi 

if [ -n "${LOGINPATHVALUE-unset}" ]; then 
LOGINPATH="--login-path=$LOGINPATHVALUE " 

fi 

# GATHERS THE LOG FILE NAME 
SLOWLOG=$(mysqladmin $LOGINPATH variables | grep slow | grep file | awk '/[a-zA-Z]/ {print $4}' ) 

# GATHER CURRENT VALUE 
LQT=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 
LQTB=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *200 AS LQTB;" | awk '/[0-9]./ {print $1}' ) 
LQTC=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *2 AS LQTC;" | awk '/[0-9]./ {print $1}' ) 

# GATHER MARKER 
DATE=`date +"%m%d%Y"` 

# RESET SLOW QUERY TIME 
# SET GLOBAL long_query_time=10; 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQTB" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#MOVE THE LOG OUT 
cp $SLOWLOG $SLOWLOG.$DATE; > $SLOWLOG 

#SET THE TIMEBACK 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQT" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#PLACE A Slow query for log 
SLOWQUERY=$(mysql $LOGINPATH -e "SELECT sleep($LQTC) " ) 

# REMOVE OLD LOG 
/bin/rm -f $SLOWLOG.$DATE;


मंगलवार, 23 सितंबर 2014

MySQL उपयोगकर्ता कनेक्शन

Original post: http://anothermysqldba.blogspot.com/2014/09/mysql-user-connections.html

तो मैं MySQL उपयोगकर्ताओं और कैसे वे प्रमाणित के साथ मतभेदों को समझा खुद को पाया. यह सब जानकारी के प्रथम नया नहीं है लेकिन यहां पाया जा सकता है:
मैं सिर्फ यह समझाने के लिए कुछ वास्तविक दुनिया उदाहरण दिखा देंगे.

यह एक उपयोगकर्ता की अनुमतियों का मूल्यांकन करता है जब MySQL उपयोगकर्ता नाम के रूप में अच्छी तरह से लॉगिन का उपयोग करता है. एक सबसे अच्छा अभ्यास अनाम उपयोगकर्ताओं को हटाना है, यही कारण है.

इस उदाहरण के लिए मैं निम्नलिखित उपयोगकर्ताओं के साथ शुरू होगा



MariaDB [(none)]> select user , host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | centos64 |
| root | centos64 |
| | localhost |
| root | localhost |
+---------+-----------+

मैं भी मैं एक उपयोगकर्ता नाम नहीं है सोचा सर्वर में प्रवेश कर सकते हैं नीचे बेनामी @ लोकलहोस्ट करने के लिए यह चूक है.


# mysql -u nobody
MariaDB [(कोई भी)]> का चयन current_user ();
+ ---------------- +
| Current_user () |
+ ---------------- +
|localhost |
+ ---------------- +
MariaDB [(कोई भी)]> शो अनुदान;
+ -------------------------------------- +
|localhost के लिए अनुदान |
+ -------------------------------------- +
| अनुदान के उपयोग पर * '@' के लिए 'लोकलहोस्ट. |
+ -------------------------------------- +

मैं कुछ नहीं कर सकता जबकि मैं अभी भी डेटाबेस में मिला है.

अब मैं एक ज्ञात उपयोगकर्ता पारित जब:


# mysql -u root -p
MariaDB [(कोई भी)]> का चयन current_user;
+ ---------------- +
| Current_user |
+ ---------------- +
| जड़ @ लोकलहोस्ट |
+ ---------------- +
MariaDB [(कोई भी)]> शो अनुदान;
+----------------------------------------------------------------------------------------------------------------------------------------+
| जड़ @ लोकलहोस्ट के लिए अनुदान |
+----------------------------------------------------------------------------------------------------------------------------------------+
| पर सभी विशेषाधिकार प्रदान * 'जड़' @ करने के लिए पासवर्ड से पहचान 'लोकलहोस्ट' '* 8CD56861FDADF7A264741F27D502D1A8DAE0A8F7' अनुदान विकल्प के साथ. |
| | अनुदान प्रॉक्सी पर '@' '' जड़ 'के लिए @ अनुदान विकल्प के साथ' लोकलहोस्ट '
+----------------------------------------------------------------------------------------------------------------------------------------+


वर्तमान में जड़ उपयोगकर्ता 4 अलग खाते हैं.

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | centos64 |
| root | localhost |
+------+-----------+

ये सभी अलग अलग खातों हैं. मैं केवल हालांकि उनमें से एक की जरूरत है. मैं केवल स्थानीय मेजबान कनेक्शन के माध्यम से रूट खाते का उपयोग करें.

MariaDB [(none)]> DROP USER 'root'@'127.0.0.1';
Query OK, 0 rows affected (0.33 sec)

MariaDB [(none)]> DROP USER 'root'@'centos64';
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> DROP USER 'root'@'::1';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+

इसलिए मैं 4 अलग अलग खातों से क्या मतलब था? वे सब जड़ उपयोगकर्ता खाते. नहीं .. वे जड़ और जो कुछ भी होस्ट कर रहे हैं. इसलिए प्रत्येक खाता (उपयोगकर्ता + मेजबान) विभिन्न अनुमतियों हो सकता था.

अंतर दिखाने के लिए अगले इसलिए हम एक उदाहरण बनाना होगा.
इसलिए इस उदाहरण में सर्वर दो नेटवर्क इंटरफेस है. इसलिए मैं विभिन्न अनुमतियों के साथ प्रत्येक मतभेद दिखाने के लिए सभी का उपयोग अंक प्रति एक उपयोगकर्ता पैदा करेगा. मैं एक ही पासवर्ड सेट हो जाएगा, लेकिन उन लोगों के रूप में अच्छी तरह से अलग हो सकता है.

MariaDB [(none)]> GRANT SELECT ON *.* TO 'anothermysqldba'@'10.0.2.15' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE , DROP, RELOAD, SHUTDOWN, PROCESS, FILE, INDEX, ALTER ON *.* TO 'anothermysqldba'@'192.168.0.%' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'anothermysqldba'@'localhost' IDENTIFIED BY '<cleartext password>' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(कोई भी)]> का चयन करें उपयोगकर्ता, जहां उपयोगकर्ता = 'anothermysqldba' mysql.user से मेजबान;
+ ----------------- + ------------- +
| उपयोगकर्ता | मेजबान |
+ ----------------- + ------------- +
| Anothermysqldba | 10.0.2.15 |
| Anothermysqldba |. 192.168.0% |
| Anothermysqldba | स्थानीय होस्ट |
+ ----------------- + ------------- +

तो इसका मतलब क्या है? MySQL एक उपयोगकर्ता विभिन्न अनुमतियों के रूप में हर उपयोगकर्ता पहुँच बिंदु को मान्य करने के रूप में अच्छी तरह से मेजबान का उपयोग करता है, क्योंकि उपयोगकर्ता नाम एक ही हैं हालांकि.

आप अपने डेवलपर्स के कुछ भरोसा हो सकता है, इस बार वे दूर से या उनकी स्क्रिप्ट के माध्यम से काम कर रहे हैं अगर उनके उपयोग के कुछ सीमित करने के लिए एक अच्छा विचार है. वे आप को शामिल नहीं करता है कि कुछ करने की जरूरत है और वे सर्वर से ही SSH और अन्य कार्य करने के लिए लॉग इन करने के लिए है. इस कोर्स के लिए अपने व्यापार और / या अनुप्रयोगों के रिश्ते और काम के प्रवाह पर निर्भर है.

10.0.2.15 मेजबान उपयोगकर्ता का उपयोग केवल चुनिंदा उपयोग किया है.

# mysql -h 10.0.2.15 -u anothermysqldba -p
MariaDB [(कोई भी)]> का चयन current_user ();
+ --------------------------- +
| Current_user () |
+ --------------------------- +
| Anothermysqldba@10.0.2.15 |
+ --------------------------- +
MariaDB [(कोई भी)]> शो अनुदान;
+-------------------------------------------------------------------------------------------------------------------------+
| Anothermysqldba@10.0.2.15 के लिए अनुदान |
+-------------------------------------------------------------------------------------------------------------------------+
| अनुदान * पर चयन * करने के लिए 'anothermysqldba'@'10.0.2.15' पासवर्ड से पहचान '* 31360D7EE84BE965C0E759179FC61B6943BCA64F'. |
+-------------------------------------------------------------------------------------------------------------------------+

192.168.0.26 मेजबान का उपयोग कर उपयोगकर्ता अधिक पहुँच गया है. यह खाता भी 192.168.0 / 255 (%) सबनेट के तहत कुछ भी भर में उपयोग करने के लिए निर्धारित है.

# mysql -h 192.168.0.26 -u anothermysqldba -p
MariaDB [(कोई भी)]> का चयन current_user ();
+ ----------------------------- +
| Current_user () |
+ ----------------------------- +
| Anothermysqldba@192.168.0.% |
+ ----------------------------- +
MariaDB [(कोई भी)]> शो अनुदान;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Anothermysqldba@192.168.0.% के लिए अनुदान |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| अनुदान का चयन करें, सम्मिलित करें, अद्यतन, बनाने, हटाने छोड़, पुनः लोड, बंद, प्रक्रिया, फ़ाइल, सूचकांक, * पर बदल * करने के लिए 'anothermysqldba'@'192.168.0.%' पासवर्ड से पहचान '* 31360D7EE84BE965C0E759179FC61B6943BCA64F'. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

आप मान लेंगे तो जैसा कि स्थानीय होस्ट उपयोगकर्ता पूर्ण पहुँच खाता है.

# mysql -u anothermysqldba -p
MariaDB [(कोई भी)]> का चयन current_user ();
+ --------------------------- +
| Current_user () |
+ --------------------------- +
| Anothermysqldba @ लोकलहोस्ट |
+ --------------------------- +
सेट में 1 पंक्ति (0.00 सेकंड)

MariaDB [(कोई भी)]> शो अनुदान;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Anothermysqldba @ लोकलहोस्ट के लिए अनुदान |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| पर सभी विशेषाधिकार प्रदान * 'anothermysqldba' @ करने के लिए पासवर्ड से पहचान 'लोकलहोस्ट' '* 31360D7EE84BE965C0E759179FC61B6943BCA64F' अनुदान विकल्प के साथ. |
+---------------------------------------------------------------------------------------------------------------------------------------------------+

यह अनाम उपयोगकर्ताओं को दूर करने के लिए सबसे अच्छा अभ्यास है अब इससे पहले कि जैसा कि मैंने कहा. का प्रयोग mysql_secure_installation स्थापना के लिए भी उसके साथ में मदद मिलेगी.

क्यों फर्क पड़ता है?

# mysql -u anothremysqldba -p
MariaDB [(कोई भी)]> का चयन current_user ();
+ ---------------- +
| Current_user () |
+ ---------------- +
|localhost |
+ ---------------- +
सेट में 1 पंक्ति (0.00

सरल उदाहरण ... ऊपर है और सिर्फ साधारण गलतियों से बचें. एक टाइपो डेटाबेस तक पहुँच, यह इस अनुमति नहीं होना चाहिए की अनुमति दी.

तो फिर हटाने और फिर से परीक्षण करें.

MariaDB [(none)]> DROP USER ''@'localhost';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> DROP USER ''@'centos64';
Query OK, 0 rows affected (0.00 sec)

# MySQL -u anothremysqldba -p
पासवर्ड दर्ज करें:
त्रुटि 1045 (28000): प्रवेश @ उपयोगकर्ता anothremysqldba 'के लिए इनकार किया पासवर्ड का उपयोग (' लोकलहोस्ट ': हाँ

अपने डेटाबेस ज्यादातर मेजबाननाम या सख्त आईपी पते और कोई वाइल्डकार्ड के रूप में% के साथ साथ बनाया जाता है तो अगर इसका मतलब क्या है?

यह आपकी ओर से एक सुरक्षा और व्यापार में निर्णय लेने के लिए किया जाएगा. व्यक्तिगत रूप से न तो मेरी राय में एक मान्य विकल्प है. एक वाइल्डकार्ड (%) कुछ नहीं बल्कि एक मजबूत पहुँच बिंदु की अनुमति देता है, लेकिन फ़ायरवॉल एक विफलता है अगर यह भी नेटवर्क उपयोगकर्ताओं के बाहर दूरदराज के लिए उपयोग को खोलता है. उपयोगकर्ता प्रति एक सख्त आईपी पता भी मेरी राय में नहीं बल्कि सख्त है, लेकिन यह उपयोगकर्ता पर निर्भर करता है. . 192.168.0%: यहां तक ​​कि मैं अभी भी एक% यानी साथ आईपी पते का उपयोग करना पसंद करते हैं नकल के लिए बनाया गया है जो किसी खाते के साथ उदाहरण के लिए. आईपी ​​पते (दूरस्थ उपयोगकर्ताओं के लिए भी स्थिर परिवर्तन डीबीए अक्सर नहीं बताया गया है) बदल सकता हूँ और यह अक्सर पहुँच विफलता पर शिकायतों के साथ डीबीए के लिए आने वाले लोगों में यह परिणाम है.

मैं एक बार एक स्थिर IP पता करने के लिए बंद हर उपयोगकर्ता पहुँच सीमित है कि एक व्यक्ति के साथ काम किया. इस व्यक्ति को लगातार अनुदान बयानों को बदलने के लिए किया था. आप अपने अंत पर सुरक्षा सुनिश्चित कर सकते हैं, जबकि लोगों को आसानी से और प्रभावी ढंग से काम करने में सक्षम होना चाहिए.


बुधवार, 13 अगस्त 2014

MySQL विदेशी कुंजी उदाहरण और त्रुटि 1452

Original post - http://anothermysqldba.blogspot.com/2014/08/mysql-foreign-keys-example-error-1452.html

तो मैं एक क्षेत्र को अद्यतन करने के लिए होने के साथ काम आज एक स्थिति भर में भाग गया लेकिन उपयोगकर्ता क्योंकि संबंधित विदेशी प्रमुख बाधाओं के ऐसा करने में असमर्थ था. 

इस ब्लॉग पोस्ट एक विदेशी कुंजी दिखा और कैसे आप ऐसा करने के लिए है, तो उन्हें अद्यतन करने के लिए एक सरल उदाहरण हो के साथ. 

सबसे पहले हमें एक साधारण तालिका बनाने और यादृच्छिक डेटा के साथ यह आबाद. 

CREATE TABLE `table_w_code` ( 
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`NameofCode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`SOMECode`) 
) ENGINE=InnoDB ; 


अब हम हमारे पिछले मेज के लिए बंधे एक विदेशी कुंजी है कि एक और टेबल की आवश्यकता होगी. 

[anothermysqldba]> CREATE TABLE `table_with_fk` ( 
`SOMEID` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`Somemorefields` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`SOMEID`,`SOMECode`), 
KEY `FK_Patient_Facility` (`SOMECode`), 
CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB; 


इसलिए हम कोशिश करते हैं और बाद में उन्हें अद्यतन कर सकते हैं तो हमें तालिकाओं में कुछ यादृच्छिक डेटा आबाद करते हैं. 
अगर जरूरत यादृच्छिक संख्या पर पिछले पोस्ट है यहां 

[anothermysqldba]> SET @A = 3; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @B = 15 - @A; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @C = 16; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @D = 25 - @C; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> INSERT INTO table_w_code VALUES 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'ABC' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'DEF' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'GHI' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'JKL' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'MNO' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'PQR' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'STU' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'VWX' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'YZ' ) ; 
Query OK, 9 rows affected (0.05 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

[anothermysqldba]> SELECT * from table_w_code ORDER BY NameofCode; 
+--------------------------+------------+ 
| SOMECode | NameofCode | 
+--------------------------+------------+ 
| 204e9800998ecf8427e | ABC | 
| f00b204e9800998e | DEF | 
| 98f00b204e9800998ecf8427 | GHI | 
| 98f00b204e9800998e | JKL | 
| 1d8cd98f00b204e9800 | MNO | 
| 1d8cd98f00b204e9800998ec | PQR | 
| 0b204e9800998ecf8427e | STU | 
| cd98f00b204e9800998ec | VWX | 
| d98f00b204e9800998ecf842 | YZ | 
+--------------------------+------------+ 
9 rows in set (0.00 sec) 

[anothermysqldba]> SET @D = 2; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @E = 25 - @D; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> INSERT INTO table_with_fk SELECT SUBSTR(md5(''),FLOOR( @D + (RAND() * @E ))), SOMECode , NameofCode FROM table_w_code; 
Query OK, 9 rows affected (0.08 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

[anothermysqldba]> select * from table_with_fk ORDER BY Somemorefields; 
+---------------------------------+--------------------------+----------------+ 
| SOMEID | SOMECode | Somemorefields | 
+---------------------------------+--------------------------+----------------+ 
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC | 
| e9800998ecf8427e | f00b204e9800998e | DEF | 
| 98ecf8427e | 98f00b204e9800998ecf8427 | GHI | 
| 00b204e9800998ecf8427e | 98f00b204e9800998e | JKL | 
| 04e9800998ecf8427e | 1d8cd98f00b204e9800 | MNO | 
| 04e9800998ecf8427e | 1d8cd98f00b204e9800998ec | PQR | 
| b204e9800998ecf8427e | 0b204e9800998ecf8427e | STU | 
| b204e9800998ecf8427e | cd98f00b204e9800998ec | VWX | 
| 4e9800998ecf8427e | d98f00b204e9800998ecf842 | YZ | 
+---------------------------------+--------------------------+----------------+ 


ठीक है कि इस उदाहरण के लिए कुछ यादृच्छिक डेटा उत्पन्न करने के तरीके के बारे में एक दौर है. 

तो क्या हम table_with_fk में एबीसी मूल्य से संबंधित डेटा को अद्यतन करने के लिए यदि आवश्यक हो तो क्या होता है? 

[anothermysqldba]> SELECT SOMEID , SOMECode , Somemorefields FROM table_with_fk WHERE Somemorefields = 'ABC'; 
+---------------------------------+---------------------+----------------+ 
| SOMEID | SOMECode | Somemorefields | 
+---------------------------------+---------------------+----------------+ 
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC | 
+---------------------------------+---------------------+----------------+ 

[anothermysqldba]> SELECT SOMECode , NameofCode FROM table_w_code WHERE NameofCode = 'ABC'; 
+---------------------+------------+ 
| SOMECode | NameofCode | 
+---------------------+------------+ 
| 204e9800998ecf8427e | ABC | 
+---------------------+------------+ 

[anothermysqldba]> 
UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e'; 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails(`anothermysqldba`.`table_with_fk`, CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION) 


यह होना चाहिए था तो ऐसा अवरुद्ध किया गया था. हम सब के बाद तालिका परिभाषा में "पर अद्यतन पर कोई कार्रवाई नहीं की कोई कार्रवाई नहीं हटाएं" है. 

हालांकि सभी नहीं खोया है. "FOREIGN_KEY_CHECKS" चर का एक सरल संपादित करें कि अद्यतन कथन पर अमल करने की अनुमति देगा. हालांकि, यह एक सौदे के भीतर, मेरी राय में, इस पर अमल करने के लिए सुरक्षित है. 


[anothermysqldba]> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET FOREIGN_KEY_CHECKS=0; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e'; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

[anothermysqldba]> SET FOREIGN_KEY_CHECKS=1; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> COMMIT; 
Query OK, 0 rows affected (0.07 sec) 


आप यदि आप एक कारण के लिए जगह में स्थापित किया था कि अपने विदेशी कुंजी मूल्यों को तोड़ने के लिए क्यों चाहते अब समग्र सवाल है? यही कारण है कि आप पर निर्भर करता है. 

आज यह किसी भी तरह एक मूल्य के डेटाबेस में मूल्य में अतिरिक्त सफेद स्थान के साथ सम्मिलित किया गया था कि क्या हुआ. तो मैं अद्यतन और सफेद स्थान को हटाने के लिए एक समान लेनदेन किया. 

कुल मिलाकर ... यह है कि यह किया जा सकता है दिखाने के लिए बस है.

शुक्रवार, 18 जुलाई 2014

MySQL secure_auth त्रुटि

Original post: http://anothermysqldba.blogspot.com/2014/07/mysql-secureauth-error.html

मैं पहले secure_auth त्रुटियों को संबोधित जब इस में यह ब्लॉक प्रतिकृति ब्लॉग पोस्ट . 

हालांकि, मैं MySQL ग्राहकों के माध्यम से जोड़ने जब मैं इस ब्लॉग में एक अधिक सामान्य तय पोस्ट बनाने लगा. इस MySQL 5.6 से पहले सर्वर के लिए है. 

तो MySQL निम्नलिखित कदम को कनेक्शन इस त्रुटि स्पष्ट करना चाहिए जब आप एक secure_auth त्रुटि मिलती है. 

+---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | 34d22ac342c35af2
 +---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | 34d22ac342c35af2 | |+---------------+-------------------------------------------+ 

SELECT @@session.old_passwords, @@global.old_passwords; +-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 

mysql> SET @@session.old_passwords = 0; SET @@global.old_passwords=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 0 | 0 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 

mysql> SET PASSWORD FOR 'authdtestuser'@'localhost' = PASSWORD('sshthisisasecret'); 
Query OK, 0 rows affected (0.00 sec) 

mysql> select User , Password from mysql.user where User = 'authdtestuser'; 
+---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | *E48BD8BF1B9F29459E5284AD158443B5B33B70E4 | 
+---------------+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SET @@session.old_passwords = 1; SET @@global.old_passwords=1; 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 
| |+---------------+-------------------------------------------+ 

SELECT @@session.old_passwords, @@global.old_passwords; +-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 

mysql> SET @@session.old_passwords = 0; SET @@global.old_passwords=0; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 0 | 0 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec) 

mysql> SET PASSWORD FOR 'authdtestuser'@'localhost' = PASSWORD('sshthisisasecret'); 
Query OK, 0 rows affected (0.00 sec) 

mysql> select User , Password from mysql.user where User = 'authdtestuser'; 
+---------------+-------------------------------------------+ 
| User | Password | 
+---------------+-------------------------------------------+ 
| authdtestuser | *E48BD8BF1B9F29459E5284AD158443B5B33B70E4 | 
+---------------+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SET @@session.old_passwords = 1; SET @@global.old_passwords=1; 

mysql> SELECT @@session.old_passwords, @@global.old_passwords; 
+-------------------------+------------------------+ 
| @@session.old_passwords | @@global.old_passwords | 
+-------------------------+------------------------+ 
| 1 | 1 | 
+-------------------------+------------------------+ 
1 row in set (0.00 sec)