2009-08-24 7 views
7

मैं एक बैश स्क्रिप्ट कर रहा हूं जो mysql कमांड लाइन प्रोग्राम का उपयोग कर एक MySQL डेटाबेस के साथ इंटरैक्ट करता है। मैं अपने एसक्यूएल में टेबल लॉक का उपयोग करना चाहता हूं। क्या मैं यह कर सकता हूं?MySQL - क्या मैं व्यावहारिक रूप से LOCK का उपयोग कर सकता हूं?

mysql -e "LOCK TABLES mytable" 
# do some bash stuff 
mysql -u "UNLOCK TABLES" 

कारण मैं पूछता हूँ, क्योंकि तालिका ताले केवल सत्र के लिए रखा जाता है, इसलिए नहीं ताला के रूप में है कि mysql कार्यक्रम खत्म रूप में जल्द ही जारी किया जाएगा है?

+0

'-u'' नहीं होना चाहिए? –

उत्तर

8

[संपादित करें]

ओपन स्कूल मूल विचार था - केवल "mysql" चलाने के एक बार , और समाधान प्रदान किए गए समाधान काम करना चाहिए, लेकिन यह डिस्क पर फीफो छोड़ दिया।

nos भी सही था कि मैं खराब हो गया: एक साधारण "echo X >FIFO" फीफो बंद कर देगा; मुझे गलत याद आया। और मेरी (हटाई गई) टिप्पणियां w.r.t. समय लागू नहीं है, क्षमा करें।

उस ने कहा, आपको फीफो की आवश्यकता नहीं है, आप एक इंटर-प्रोसेस पाइप का उपयोग कर सकते हैं। और मेरी पुरानी MySQL स्क्रिप्ट्स को देखकर, कुछ इस तरह काम करते थे, लेकिन आप किसी भी आदेश को stdout (कुछ "exec" चाल के बिना) लिखने दें।

#!/bin/bash 
(
    echo "LOCK TABLES mytable READ ;" 
    echo "Doing something..." >&2 
    echo "describe mytable;" 
    sleep 5 
    echo "UNLOCK tables;" 
) | mysql ${ARGUMENTS} 

एक और विकल्प फीफो को फ़ाइल डिस्क्रिप्टर असाइन करना हो सकता है, फिर इसे पृष्ठभूमि में चलाएं। यह बहुतnos के समान है, लेकिन "exec" विकल्प को बैश आदेश चलाने के लिए उपशीर्षक की आवश्यकता नहीं होगी; कुछ नियंत्रण मुद्दों देखते हैं

#!/bin/bash 
# Use the PID ($$) in the FIFO and remove it on exit: 
FIFO="/tmp/mysql-pipe.$$" 
mkfifo ${FIFO} || exit $? 
RC=0 

# Tie FD3 to the FIFO (only for writing), then start MySQL in the u 
# background with its input from the FIFO: 
exec 3<>${FIFO} 

mysql ${ARGUMENTS} <${FIFO} & 
MYSQL=$! 
trap "rm -f ${FIFO};kill -1 ${MYSQL} 2>&-" 0 

# Now lock the table... 
echo "LOCK TABLES mytable WRITE;" >&3 

# ... do your other stuff here, set RC ... 
echo "DESCRIBE mytable;" >&3 
sleep 5 
RC=3 
# ... 

echo "UNLOCK TABLES;" >&3 
exec 3>&- 

# You probably wish to sleep for a bit, or wait on ${MYSQL} before you exit 
exit ${RC} 

ध्यान दें कि: इसलिए आप "आर सी" स्थापित करने के लिए "अन्य सामग्री" में अनुमति होगी

  • इस कोड को कोई त्रुटि लॉक करने के लिए विफलता की जांच करने के लिए (या "अन्य सामान" के भीतर कोई भी SQL आदेश )। और यह निश्चित रूप से गैर-तुच्छ है।
  • पहले उदाहरण में, "अन्य सामान" एक सबहेल के भीतर है, आप आसानी से उस संदर्भ से स्क्रिप्ट का रिटर्न कोड सेट नहीं कर सकते हैं।
+0

यदि आप गूंज करते हैं तो आपको एक सबहेल या अन्य ट्रिकरी की आवश्यकता होगी ...> $ {FIFO} mysql केवल 1 कमांड के बाद बाहर निकल जाएगा क्योंकि लेखन अंत पाइप को बंद कर देता है – nos

+0

आप बिल्कुल सही हैं, मेरी स्क्रिप्ट ' टी काम करते हैं जबकि आपका होना चाहिए (लेकिन यह डिस्क पर फीफो छोड़ देता है)। – NVRAM

+0

इसे "मेरी मूल लिपि" बनाएं ... – NVRAM

4

यहाँ एक तरह से मैं वहाँ एक आसान तरीका है, हालांकि है यकीन है, ..

mkfifo /tmp/mysql-pipe 
mysql mydb </tmp/mysql-pipe & 
(
    echo "LOCK TABLES mytable READ ;" 1>&6 
    echo "Doing something " 
    echo "UNLOCK tables;" 1>&6 
) 6> /tmp/mysql-pipe 
2

मेरे लिए इस मुद्दे को देखते हुए मुझे पता चला कि एक बहुत ही रोचक दृष्टिकोण है MySQL के SYSTEM कमांड का उपयोग कर। मैं अभी भी यकीन है कि वास्तव में क्या, कमियां हैं, यदि कोई हो नहीं कर रहा हूँ, लेकिन यह निश्चित मामलों का एक बहुत के लिए काम करेंगे:

उदाहरण:

mysql <<END_HEREDOC 
LOCK TABLES mytable; 
SYSTEM /path/to/script.sh 
UNLOCK TABLES; 
END_HEREDOC 

यह ध्यान देने योग्य बात यह है कि * nix पर यह केवल काम करता है, जाहिर है, as does the SYSTEM command

क्रेडिट डैनियल Kadosh को जाता है: http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html#c10447

0

एक और दृष्टिकोण mkfifo आदेशों के बिना:

cat <(echo "LOCK TABLES mytable;") <(sleep 3600) | mysql & 
LOCK_PID=$! 
# BASH STUFF 
kill $LOCK_PID 

मुझे लगता है कि अम्र का जवाब आसान है। हालांकि मैं इसे साझा करना चाहता था क्योंकि किसी और को थोड़ा अलग जवाब की भी आवश्यकता हो सकती है।

sleep 3600 इनपुट 1 घंटे के लिए रोक देता है। आप इसे यहां रोकने के लिए अन्य आदेश पा सकते हैं: https://unix.stackexchange.com/questions/42901/how-to-do-nothing-forever-in-an-elegant-way

lock tables एसक्यूएल तुरंत चलाता है, तो यह नींद टाइमर की प्रतीक्षा करेगा।

संबंधित मुद्दे

 संबंधित मुद्दे