মাইএসকিউএল ডাম্পগুলি থেকে ডিফাইনার ধারাটি সরান


114

আমার একটি ডাটাবেসের একটি মাইএসকিউএল ডাম্প রয়েছে। এটিতে এখানে ডিফাইনার ধারা রয়েছে যা দেখতে দেখতে,

"DEFINER=`root`@`localhost`" 

যথা, এই ডিফাইনার ধারাগুলি আমার তৈরি দেখুন এবং তৈরি প্রক্রিয়া বিবৃতিতে রয়েছে। আমার ডাম্প ফাইল থেকে এই ডিফাইনার ধারাগুলি সরানোর কোনও উপায় আছে কি?


কয়েক বছর আগে একটি বাগ রিপোর্ট করা হয়েছিল তবে এটি পরিত্যক্ত দেখাচ্ছে: bugs.mysql.com/bug.php?id=24680
1234ru

উত্তর:


109

আমি মনে করি না যে ডাম্পগুলিতে DEFINERএস যুক্ত করার উপেক্ষা করার কোনও উপায় আছে । তবে ডাম্প ফাইল তৈরি হওয়ার পরে সেগুলি সরানোর উপায় রয়েছে।

  1. একটি পাঠ্য সম্পাদকটিতে ডাম্প ফাইলটি খুলুন এবং DEFINER=root@localhostখালি স্ট্রিংয়ের সমস্ত উপস্থিতি প্রতিস্থাপন করুন ""

  2. ব্যবহার করে ডাম্প (বা পাইপ আউটপুট) সম্পাদনা করুন perl:

    perl -p -i.bak -e "s/DEFINER=\`\w.*\`@\`\d[0-3].*[0-3]\`//g" mydatabase.sql
  3. এর মাধ্যমে আউটপুটটি পাইপ করুন sed:

    mysqldump ... | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > triggers_backup.sql

1
@ ফাস্টট্র্যাক, দয়া করে পুরো স্ট্রিংটি সরান।
অভয়

3
আমি উল্লেখ করার পরামর্শ দিচ্ছি যে ডিফাইনারটি অপসারণের পরিবর্তে এটি CURRENT_USER এর মতো সেট করা যেতে পারে: sed -E 's/DEFINER=[^ ]+@ [^] + /DEFINER=CURRENT_USER/g' dump.sql > new_dump.sqlএতে বিধিনিষেধ / অ্যাক্সেস নিয়ন্ত্রণ রাখার সুবিধা রয়েছে।
চতুর্থ ফ্লুরস্টুডিওগুলি

27
sedকমান্ড পদ্ধতি এবং ফাংশন থেকে DEFINER দফা মুছে যায় না। দেখুন, ট্রিগার, পদ্ধতি এবং কার্যাদি পরিচালনা করে এমন বর্ধিত সংস্করণ এখানে: sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*PROCEDURE/PROCEDURE/' | sed -e 's/DEFINER[ ]*=[ ]*[^*]*FUNCTION/FUNCTION/'
ভ্লাদিমির স্ট্রুগাটস্কি

4
এফওয়াইআই --- যদিও এই উত্তরের সময় তেমনটি ছিল না, মাইএসকিউএল> 5.6 এখন একটি মাইএসকিলডাম্প (1) সহ জাহাজ যা একটি বিকল্প হিসাবে "--স্কিপ-প্রিমিয়ার" সমর্থন করে: dev.mysql.com/doc/refman /5.7/en/…
কেভিন_কিনসে

4
না, এটি মাইএসকিএলড্প নয়, তবে মাইএসকিএল পি আম্প যার কাছে --স্কিপ-প্রিমিয়ার রয়েছে।
এক্সডিজি

70

আপনি এসইডি ব্যবহার করে মুছে ফেলতে পারেন

sed -i 's/DEFINER=[^*]*\*/\*/g' mydump.sql

ম্যাকোজে:

sed -i '' 's/DEFINER=[^*]*\*/\*/g' mydump.sql

ম্যাকোসে এখানে কী চলছে যা আলাদা হতে পারে?
অ্যালেক্স

1
ম্যাক অনের জন্য ম্যানপেজটি বলেছেন: -i extension"স্থানে ফাইলগুলি সম্পাদনা করুন, নির্দিষ্ট এক্সটেনশনের সাহায্যে ব্যাকআপগুলি সংরক্ষণ করুন zero শূন্য দৈর্ঘ্যের এক্সটেনশন দেওয়া থাকলে কোনও ব্যাকআপ সংরক্ষণ হবে না when যখন শূন্য দৈর্ঘ্যের এক্সটেনশন দেওয়ার পরামর্শ দেওয়া হয় না when জায়গাগুলিতে সম্পাদনা ফাইলগুলি, যেমন আপনি ডিস্কের স্থান নিঃশেষ হয়ে যাওয়া ইত্যাদি পরিস্থিতিতে দুর্নীতি বা আংশিক সামগ্রী ঝুঁকিপূর্ণ করেন। "
চাদ

এটি জানতে পেরে ভালো লাগলো, @ চাদ। আমি এখন 5+ বছর ধরে ম্যাকের মতো এইভাবে সেড ব্যবহার করছি। আমার কখনও স্থান বা দূষিত ফাইল নিয়ে সমস্যা হয়নি। তবে অবশ্যই বিবেচ্য বিষয়। স্পষ্ট করার জন্য ধন্যবাদ।
রিকার্ডো মার্টিনস

আমি ম্যাকের মধ্যে কখনই এই সমস্যাগুলিতে প্রবেশ করিনি। ভেবেছিলাম @ অ্যালেক্সের জিজ্ঞাসা থেকে আমি স্পষ্ট করব :)
চাদ

57

যেহেতু মাইএসকিএল সংস্করণ Since. you.৮ আপনি --skip-definerমাইএসকিপল্প সহ বিকল্পটি ব্যবহার করতে পারেন , যেমন:

mysqlpump --skip-definer -h localhost -u user -p yourdatabase

Http://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#option_mysqlpump_skip-definer এ আপডেট করা মাইএসকিএল ম্যানুয়াল দেখুন


8
যার জন্য mysqldumpএবং mysqlpump- এর মধ্যে পার্থক্য কী তা আশ্চর্য করে যে এটি এখানে সম্পর্কিত প্রশ্ন: dba.stackexchange.com/questions/118846/mysqldump-vs-mysqlpump
স্ক্যাজ

আমি পিএইচপিএমওয়াইএডমিন এবং মাইএসকিউএল ওয়ার্কবেঞ্চ ইনস্টল করেছি। আমি কীভাবে উইন্ডোজটিতে এই আদেশটি কার্যকর করব?
posfan12

(কিছু পরীক্ষার পরে: -১) এটি ব্যবহার করে information_schema.userএবং এটি সব ব্যবহারকারীর জন্য সর্বদা পঠনযোগ্য নয়
bato3

17

আমি এই ধারণাগুলি আমার নিজের মাইএসকিল্ডাম্প আউটপুট থেকে ডিফাইনার ধারাটি সরাতে ব্যবহার করেছি, তবে আমি একটি সহজ পদ্ধতির গ্রহণ করেছি:

!কোড এবং ডিফাইনারের আগে কেবল সরিয়ে দিন , এবং বাকী মন্তব্যটি একটি নিয়মিত মন্তব্যে পরিণত হয়।

উদাহরণ:

/*!50017 DEFINER=`user`@`111.22.33.44`*/

অসহায় করে দেওয়া হয়, এটি করা যতটা কম ..

/* 50017 DEFINER=`user`@`111.22.33.44`*/

সবচেয়ে সহজ রেজিএক্সপ্যাকটি হ'ল অপসারণ! এবং সংখ্যা

mysqldump | /usr/bin/perl -pe 's/\!\d+ DEFINER/DEFINER/' > dumpfile.sql

এটি !#### DEFINERডিফাইনারের সাথে সরিয়ে এবং প্রতিস্থাপন করে ... আপনি ডিফাইনারটিকেও সরাতে পারেন, আসলেই কিছু আসে যায় না - একবার "!" এটা গেছে


16

অন্যের সুপারিশ অনুসারে, ডাম্প শেষ হওয়ার পরে কীভাবে ডাম্প থেকে ডিফাইনার সরানো যায় তার একটি উদাহরণ:

mysqldump -u user --password='password' -h localhost database | grep -v "50013 DEFINER" > dump.sql

4
ট্রিগারগুলির জন্য, লাইনগুলি দেখতে * / 5000! তৈরি করুন * / / *! 50017 ডিফাইনার = user@ localhost* / / *! 50003 ট্রিগার My_triggername এর আগে My_table on প্রতিটি ROW এর জন্য .... * / ;; এবং grep -vএই লাইনগুলি পুরোপুরি ফেলে দেবে। (যদিও 50017! = 50013)
কেনে

13

অন্যরা যেমন উল্লেখ করেছিলেন যে কোনও ধরণের নিয়মিত অভিব্যক্তি দিয়ে সুনির্দিষ্টভাবে ফেলা খুব জটিল নয়। তবে অন্যান্য উদাহরণগুলি আমার জন্য দর্শন সংজ্ঞাটি ছিনিয়ে নিয়েছে।

এটি আমার জন্য নিয়মিত প্রকাশ যা কাজ করেছে:

sed -e 's/DEFINER=[^ ]* / /'

এবং দ্রুত
কেভিন ল্যাবকোট

1
ট্রিগারগুলির সাথে কাজ করে না - এটিও সরিয়ে দেয় */। মাইএসকিউএল 5.6.31।
ফ্রাঙ্ক ড্রবনিč

10

একটি স্বয়ংক্রিয় সমাধানের জন্য, আপনি তাকান পারে mysqlmigrate। এটি একটি ব্যাশ মোড়কের চারপাশে mysqldumpযা আপনাকে ডাটাবেসগুলিকে স্থানান্তর করতে এবং ডিফাইনার স্টেটমেন্টগুলিকে উপেক্ষা করতে দেয়। উদাহরণ:

$ mysqlmigrate -u root -p pass --ignore-definer from_db to_db

http://thesimplesynthesis.com/post/mysqlmigrate (বা গিটহাব )

অন্যথায়, হ্যাঁ, অভয়ের মতো একটি কমান্ড প্রয়োজন:

$ mysqldump -u root -ppass the_db | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > the_db.sql

6

ওএসএক্স-এ অন্য ফাইলটি ইন-ফাইলের সুনির্দিষ্ট অপসারণ করতে:

sed -i '' 's/DEFINER=`[^`][^`]*`@`[^`][^`]*`//g' file.sql

5

আপনার উত্তরটি এখানে দেখতে হবে: /dba/9249/how-do-i-change-the-definer-of-a-view-in-mysql/29079#29079

এই সমস্যার সমাধান করার জন্য আমার মতে সবচেয়ে ভাল উপায়, সেড বা গ্রেপ বা অন্য কোনওটির সাথে স্ট্রিংয়ের অতিরিক্ত পার্স যুক্ত করা নয়, এর পরিবর্তে মাইএসকিএলডাম্প - যুক্ত-লেনদেন যুক্ত করে একটি ভাল ডাম্প তৈরি করতে সক্ষম


কেন ডাউনভোটেড? কেন এই উত্তর দরকারী হিসাবে বিবেচিত হয় না?
হোসে নোবাইল

1
আপনার প্রতিক্রিয়াটির উপযুক্ত অবস্থানটি পেতে এখনও প্রায় 90 টি আপভোট দরকার v আপনার আমার আছে :)
প্যাট্রিক ভ্যান বার্গেন

4

একটি দ্রুত উপায় এই কাজ করতে আউটপুট নল হয় mysqldump মাধ্যমে sed মুছে ফেলার জন্য DEFINERশর্তসাপেক্ষ মন্তব্য আবৃত বিবৃতি। আমি বিবৃতি DEFINERথেকে সরানোর জন্য এটি ব্যবহার করি CREATE TRIGGERতবে আপনি নিজের উদ্দেশ্য অনুসারে রেজিজে শর্তের মন্তব্য সংস্করণ নম্বরটি টুইঙ্ক করতে পারেন।

mysqldump -u user --password='password' -h localhost database | \
  sed 's/\/\*!50017 DEFINER=`.*`@`.*`\*\///' 

1
কিছুটা বেশি পঠনযোগ্য সেড স্টেটমেন্ট: সেড "ডি / ডিফাইনার (। *?) ফাংশন / ফাংশন /"

4

এটি সাহায্য করে কিনা তা নিশ্চিত নয় তবে আমি এসকিউএলজি কমিউনিটি সংস্করণ ব্যবহার করি যা এখানে পাওয়া যায়: -

https://code.google.com/p/sqlyog/wiki/Downloads

যখন স্কুয়েল ডাম্প করা হয় বা অন্য ডাটাবেসে অনুলিপি করা হয় তখন এটি আপনাকে 'ডিফাইনার উপেক্ষা করুন' করতে দেয়

এটি নিখরচায় এবং প্রচুর লোকের জন্য প্রয়োজনীয় বুনিয়াদি কার্যকারিতা সরবরাহ করে

এখানে একটি প্রদত্ত সংস্করণ পাওয়া যায়:

https://www.webyog.com/product/sqlyog

চিয়ার্স


কেবল 'দরকারী নয়' হিসাবে পতাকাঙ্কিত করার চেয়ে সম্ভবত আপনি কেন এটি দরকারী না বলে উত্তর দিলে এটি আরও কার্যকর হবে?
itfidds

3

আমার জন্য, এই কাজ করে: perl -p -i.bak -e "s/DEFINER=[^ |\s]*//g" yourdump.dmp। এটি প্রতিটি তৈরি পদ্ধতির বিবরণীতে আমার ডাম্প থেকে DEFINER = রুট @ লোকালহোস্ট সরানো হয়েছে


2

MySQL 5.6.xলিনাক্স এবং লিনাক্সের জন্য ডিফাইনার তথ্য অপসারণের জন্য এখানে একটি সম্পূর্ণ কার্যক্ষম সমাধান । (পরীক্ষিত CentOS 6.5)।

সাধারণত আমাদের মাইএসকিএল ডাম্প থেকে নিম্নলিখিত এন্ট্রিগুলি প্রতিস্থাপন করতে হবে (যদি ডেটা এবং ট্রিগার / রুটিন / ফাংশন সহ নেওয়া হয়)।

/*!50013 DEFINER=`MYSQLUSER`@`localhost` SQL SECURITY DEFINER */
/*!50013 DEFINER=`MYSQLUSER`@`%` SQL SECURITY DEFINER */
CREATE DEFINER=`MYSQLUSER`@`%` PROCEDURE `PROCEDURENAME`(
CREATE DEFINER=`MYSQLUSER`@`localhost` PROCEDURE `PROCEDURENAME`(
CREATE DEFINER=`MYSQLUSER`@`%` FUNCTION `FUNCTIONNAME`(
CREATE DEFINER=`MYSQLUSER`@`localhost` FUNCTION `FUNCTIONNAME`(
/*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`%`*/ /*!50003 TRIGGER `TRIGGERNAME`
/*!50003 CREATE*/ /*!50017 DEFINER=`MYSQLUSER`@`localhost`*/ /*!50003 TRIGGER `TRIGGERNAME`

ডাম্পটি নিচে মাইএসকিলডাম্প কমান্ড সহ নেওয়া হয়েছিল।

mysqldump -uMYSQLUSER -pPASSWORD DATABASENAME -R > dbdump.sql

ডিফাইনারের কোনও তথ্য না দিয়ে প্রয়োজনীয় ডাম্প ফাইলটি নীচে তিনটি কমান্ডের সাহায্যে পাওয়া যাবে।

Command-1    
sed -i 's|DEFINER=[^*]*\*|\*|g' [PATH/]dbdump.sql

Command-2
find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`localhost\`//"

Command-3
find -name [PATH/]dbdump.sql | xargs perl -pi -e "s/ DEFINER=\`MYSQLUSER\`@\`%\`//"

যদি ডাম্প ফাইলটি আপনার বর্তমান ফোল্ডারে থাকে তবে [PATH /] উপেক্ষা করুন।

যদি টেবিলগুলিতে ডেটাগুলি খুব বিশাল হয় তবে দুটি ফর্মের মধ্যে ডাম্প নিন, একটি ডাম্প ফাইলে কেবলমাত্র স্ক্রিপ্টগুলির ডাম্প নেওয়ার জন্য ডাম্প এবং অন্য ডাম্প ফাইলে নিন (ট্রিগার / ফাংশন / পদ্ধতি)) এবং উপরের তিনটি চালান ২ য় ডাম্প (স্ক্রিপ্ট) ফাইলের কমান্ড


1

আপনার সমস্ত নির্দিষ্ট ব্যবহারকারীকে CURRENT_USER দিয়ে প্রতিস্থাপন করুন। আমার গ্রেড স্ক্রিপ্ট যা ব্যাকআপ তৈরি করে, আমার প্রতিস্থাপন স্ক্রিপ্টটি দেখতে দেখতে:

ant.replaceregexp(file: "$buildDir/sql/setupDB.sql", match: "`${project.ext.prod_db_username}`@`%`", replace: "CURRENT_USER", byline: true);

যা সত্যই কেবল এএনটি কল করছে। তাহলে আপনাকে এটি নিয়ে চিন্তা করতে হবে না।


1

লিনাক্স মেশিনে আপনি এই ওয়ান-লাইনার ব্যবহার করতে পারেন:

mysql -uuser -ppwd -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL and table_schema like 'mydb%'" | mysql -uuser -ppwd -A --skip-column-names | sed -rn 's/.*?VIEW ([^\s]+?) (AS .*?)\s([^\s]+?)\s([^\s]+?)/DROP VIEW \1;\nCREATE VIEW \1 \2;/p' | mysql -uuser -ppwd -A --skip-column-names

আপনার ডিবি ব্যবহারকারীর শংসাপত্র এবং ডাটাবেসের নাম / মত প্যাটার্নের সাহায্যে কেবল স্ট্রিংগুলি প্রতিস্থাপন করতে হবে।

এখানে আরও তথ্য: http://blog.novoj.net/2014/05/16/recreate-mysql-views-without-definer-one-liner-solution-linux/


1

এটি কেবলমাত্র উইন্ডোজের আওতায় কাজ করতে পারলাম:

ইনস্টল করুন http://gnuwin32.sourceforge.net/ আছে sed কমান্ড লাইনে এবং Windows থেকে এটি যোগ পাথ: ডি: \ প্রোগ্রাম \ GetGnuWin32 \ বিন;

sed -i "s|DEFINER=`mydbuser`@`%%` SQL SECURITY DEFINER||g" "D:/prod_structure.sql"

sed -i "s|DEFINER=`mydbuser`@`%%`||g" "D:/prod_structure.sql"

mysqldump -P{port} -h{host} -u{user} -p{password} --routines --no-data --lock-tables=false database_prod > D:\prod_structure.sql

1

ইঙ্গিতগুলির জন্য আপনাকে সমস্ত ধন্যবাদ। অলসতার কারণে আমি একটি স্ক্রিপ্ট লিখেছিলাম: "এমওয়াইস্ক্লডাম্প":

DB=$1
HOST=$2
USER=$3
MYSQLDUMP='/usr/bin/mysqldump'
PARAMS="--complete-insert --disable-keys=0 --extended-insert=0 --routines=0 --skip-comments"
DAY=`date +%d`
MONTH=`date +%m`
YEAR=`date +%Y`
FILE=$DB.$DAY-$MONTH-$YEAR.sql

    if (( $# < 3 )) ; then
        echo ""
        echo "usage: MYsqldump <db> <host> <user>"
        echo ""
        exit 1
    fi

    $MYSQLDUMP -h $HOST -u $USER -p  $PARAMS $DB | grep -v '/*!50013 DEFINER' > $FILE

1

যেমন কিছু জন্য:

DELIMITER ;;
ডিফাইনার তৈরি করুন = `mydb` @` লোকালহোস্ট` ফাংশন `মাইফंक्शन` () পূর্বে প্রত্যাবর্তন (11)
শুরু করা
(...)
শেষ ;;

এটা চেষ্টা কর:

mysqldump - ফোর্স --routines --opt --user = মাইউজার - ডেটাবেসগুলি মাইডিবি | সেড-এর '/ ডিফাইনার = `। *` @ `। *` \ // জি'

1
  1. যে কোনও সম্পাদক দিয়ে আপনার ডাটাবেসটি খুলুন, আমি নোটপ্যাড ++ দিয়ে ব্যবহার করেছি,

  2. সমস্ত পরীক্ষা এটি সন্ধান করুন DEFINER=root@localhost এবং এটিকে কোনও ( "") IE দিয়ে প্রতিস্থাপন করুন । মুছে ফেল.

তারপরে আপনি এটি যে কোনও হোস্টকে ইম্পোর্ট করতে পারেন।


0

সবথেকে সহজ রেগেক্স যা আমার জন্য সমস্ত বস্তুর সাথে কাজ করে:

sed 's/DEFINER=[^ ]*`//' ...

নোটটি quote-namesথাকতে হবে TRUE(যা ডিফল্টরূপে)।

আশা করি যে নতুন সংস্করণগুলিতে --skip-definerমাইএসক্লাম্পে 5.7 সংস্করণে স্যুইচটি চালু হয়েছে মাইএসকিএলডামেও আসে।


0

আমি পাওয়ারশেল স্ক্রিপ্টটি এর সাথে সমস্ত লাইন অপসারণ করতে ব্যবহার করেছি DEFINER:

get-content $ file_in_ful_path | পান স্ট্রিং-প্যাটার্ন select লাইন_ স্ট্রিং_ডিলেট-ননম্যাচ | ফাইল-প্রস্থ 1000000000-এনকোডিং ডিফল্ট-ফাইল_আউট_ফুল_পথ


0

কিছুই আমার পক্ষে কাজ করছিল না, তাই আমার নিজের রেজেেক্স লেখার দরকার ছিল।

  1. আপনার ডাটাবেস ফাইল, catপুরো ফাইল এবংgrep কেবলমাত্র আপনার নির্দিষ্ট বিবৃতিগুলিতে তা দেখার করুন।

    বিড়াল file.sql | গ্রেপ -ও-ই '। {, 60} ডিফাইনার {, 60}'

  2. আপনার রেজেক্স লিখুন

  3. এই রেজেক্সের সাহায্যে আপনার ডাম্পগুলিকে সেডের মধ্যে পাইপ করুন। উদাহরণস্বরূপ আমার বিবৃতিটি হ'ল:

    mysqldump | সেড-ই এর // *! 500 [0-9] [0-9] DEFINER =। +? * /// '| সেড-ই '/ ডিফাইনার = ?[^ ]+?? @ ?[^ ]+?? //'

  4. লাভ!


0

remove_definers.bat:

@echo off
(for /f "tokens=1,2*" %%a in (dumpfile.sql) do (
 if "%%b"=="" (echo %%a) else (
  echo %%b | find "DEFINER" > null && echo %%a %%c || echo %%a %%b %%c
 )
)) > dumpfile_nodefiners.sql
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.