অনেক দর্শনে DEFINER সংশোধন করুন


25

একটি আপডেটের পরে আমার ডাটাবেসগুলি ব্যাক আপ করতে আমার সমস্যা হচ্ছে । আমি আমার সিস্টেমে ঘুরে বেড়াচ্ছি কেন তা জানার চেষ্টা করছি। আমি যে দৃষ্টিতে ছুটে এসেছি সেগুলি এই ফলাফলটি দিয়েছিল।

Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES

কিছু তদন্তের পরে দেখা যাচ্ছে যে এই মতামতের জন্য সুনির্দিষ্ট একটি পুরানো বিকাশকারী অ্যাকাউন্ট যা সিস্টেম থেকে মুছে ফেলা হয়েছে। এই সমস্যার সাথে থাকা ডাটাবেসগুলি এবং দর্শনগুলি খুব কম সময়েই ব্যবহৃত হয় এবং বেশিরভাগ সংরক্ষণাগারগুলির জন্য রাখা হয়।

একটি নির্দিষ্ট সঙ্গে প্রায় 40 টি মতামত রয়েছে যা আর বিদ্যমান নেই। একসাথে সব কিছুতে আলাদা অ্যাকাউন্টে নির্দিষ্টটি পরিবর্তন করার কী সহজ উপায় আছে? সমস্ত দর্শনগুলি কোনও ফাইলের বাইরে ফেলে দেওয়ার জন্য কি মাইএসকিএলডাম্প পাওয়ার কোনও উপায় আছে যাতে আমি সেই ফাইলটি সম্পাদনা করতে পারি এবং দর্শনগুলি পুনরায় তৈরি করতে পারি?


আমার জন্য, আমি সবেমাত্র ডাটাবেসে অনুপস্থিত অ্যাকাউন্ট যুক্ত করেছি এবং ত্রুটিটি চলে গেছে।
ব্যবহারকারী 1794918

উত্তর:


13

সমস্ত দর্শন সংজ্ঞা সহ একটি পাঠ্য ফাইল তৈরি করুন:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

আপনি সেখান থেকে AllMyViews.sql সম্পাদনা করুন। তারপরে, দৃশ্যগুলি ফেলে দিন

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

AllMyViews.sql সম্পাদনার পরে এগুলি পুনরায় লোড করুন

mysql -uusername -ppassword -A < AllMyViews.sql

একবার চেষ্টা করে দেখো !!!


+1 একটি দুর্দান্ত বিকল্প হিসাবে যদি তথ্য_স্কেমার ভিউ_ডিফিনিশনটি প্রদর্শিত না হয় তবে দেখান ক্রিয়েট ভিউটি ভাল কাজ করে।
ডেরেক ডোনিয়ে

আমি যখন ডিস্টেস্টের সমাধানটি তাত্ত্বিকভাবে আরও ভাল পছন্দ করেছি তখন আমার সিস্টেম সম্পর্কে কিছু এটি কাজ করা থেকে বিরত ছিল। আমি মূলত উপরেরটি শোতে কোনও বিবরণ তৈরির বিবরণীটিকে কোনও ফাইলে ডাম্প করতে ব্যবহার করেছিলাম এবং আমাকে সেগুলি ম্যানুয়ালি সম্পাদনা করতে হয়েছিল এবং তারপরে এগুলি চালাতে হয়েছিল।
জোরডাচে

যখন সুনির্দিষ্ট ব্যবহারকারীর অস্তিত্ব না থাকে তখন ক্রিয়েট ভিউ কাজ করে না - এটি মাইএসকিल्डম্পের মতো একই ত্রুটি নিক্ষেপ করে:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555 তারপরে, আপনাকে অবশ্যই অস্থায়ীভাবে সেই ব্যবহারকারী তৈরি করতে হবে। চালান CREATE USER 'abc'@'1.2.3.4';। তারপরে, আবার চেষ্টা করুন।
রোল্যান্ডোমাইএসকিউএলডিবিএ

আমি কেবল লক্ষ্য করেছি যে ভিউটি কিছু সঞ্চিত প্রক্রিয়া ব্যবহার করে এবং সেই ত্রুটি বার্তাটি সেই প্রক্রিয়াটির যথাযথের সাথে পুনরায় সংযুক্ত করা হয়, নিজেই
দেখেনি

25

আপনি তথ্য স্কিমার সাথে একত্রে অলটার ভিউ ব্যবহার করতে পারেন । আপনি এটি একটি পাঠ্য ফাইলে ফেলে দেওয়ার কথা উল্লেখ করেছেন, তাই সম্ভবত এরকম কিছু:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

এটি মাইএসকিএল কমান্ড লাইনের সাথে (মিশ্রণ করুন * নিক্স, উইন্ডোগুলির সাথে পরিচিত নয়) সাথে মিশ্রিত করুন:

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

সিডিনোট: আপনি সরাসরি তথ্য_স্কেমার এন্ট্রিগুলিকে পরিবর্তন করতে পারবেন না । দ্রষ্টব্য 2: এটি একবারে কেবলমাত্র একটি ডাটাবেসের জন্য কাজ করে, যদি আপনি WHERE টেবিল_সেমিটা ছেড়ে দেন তবে আপনার প্রত্যেকের মধ্যে USE কমান্ড সন্নিবেশ করা দরকার।


আমি এটি পছন্দ করি কারণ এটি আমার চেয়ে সামান্য কম জড়িত এবং আরও সংক্ষিপ্ত বলে মনে হয়। +1 !!! (আমি
অলটার ভিউ

কোন ধারণা কেন ভিউ_ডিফিনিশন ক্ষেত্রটি খালি থাকবে? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; আয়| Staff | |
Zoredache

চ্যাটের আলোচনার থেকে দেখে মনে হচ্ছে এটি দুর্দান্ত সুবিধার সাথে অনুমতি সংক্রান্ত সমস্যা। bugs.mysql.com/bug.php?id=39733
ডেরেক ডাউনি

নিখুঁত সমাধান! +1
পাবলো মার্টিনেজ

কমপক্ষে রেডহ্যাটে, যদি আপনি কোনও ফাইলের আউটপুট echo "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
তুলছেন

3

ডেরেক এর সমাধানে স্বয়ংক্রিয়, এই DEFINER পরিবর্তন করতে হবে root@localhostএবং সেট SQL SECURITY INVOKERসব ডাটাবেস সকল দৃশ্য মধ্যে (! নিশ্চিত করুন যে আপনি যে প্রথম চাই):

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

সতর্কতা: নিশ্চিত হয়ে নিন যে আপনি এটি চালানোর আগে একটি সম্পূর্ণ মাইএসকিএল ব্যাকআপ করেছেন (যেমন, মাইএসকিএলডি বন্ধ করে এবং / var / lib / mysql তে সমস্ত ফাইল ব্যাক আপ করে রেখেছেন) - সেক্ষেত্রে ... এটি আমার পক্ষে কাজ করেছে, তবে ওয়াইএমএমভি ।

আপনার সমস্ত টেবিল / ভিউ এর সাথে পরীক্ষা করা উচিত:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

দর্শনগুলির ক্ষেত্রে এটি আর অবৈধ সংজ্ঞা সম্পর্কিত অভিযোগ করা উচিত নয়।


নির্লজ্জভাবে এটি আমার স্নিপকেটে যুক্ত করেছে। ধন্যবাদ!
স্টেফগোসেলিন

3

ডাটাবেসের সমস্ত দর্শন রফতানি করুন <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

বা:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

সম্পাদনা করুন views.sql(সুনির্দিষ্ট পরিবর্তন করুন ) এবং এগুলি পুনরায় তৈরি করুন:

cat views.sql | mysql <DB>

উল্লেখ করুন -uএবং -pপ্রয়োজনে স্যুইচ করুন।


কোন উপায়ে ভিউজগুলি views.sqlসম্পাদনা করা উচিত? এছাড়াও, কিভাবে তাদের পুনরায় তৈরি করবেন?
শেরিলহোমান

@SherylHohman পরিবর্তন DEFINER = olduser@oldhostকরতে DEFINER = newuser@newhost, cat views.sql | mysql <DB>মতামত recreates।
এক্স-ইউরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.