টেবিল তৈরি করতে পারে না, তবে টেবিলের অস্তিত্ব নেই


11

আমি একটি টেবিল তৈরি করতে এই পদক্ষেপগুলি ব্যবহার করছি my_user, এটি ইতিমধ্যে বিদ্যমান ছিল তবে আমার ডাটাবেস থেকে একরকম হারিয়ে গেছে my_db:

mysql> USE my_db;
mysql> DROP TABLE my_user;
mysql> ERROR 1051 (42S02): Unknown table 'my_user'
mysql> CREATE TABLE my_user (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
mysql> ERROR 1005 (HY000): Can't create table 'my_db.my_user' (errno: -1)

# mysqladmin flush-tablesউপরের পদক্ষেপগুলির চেষ্টা ও পুনরাবৃত্তি করা কিন্তু এটি কার্যকর হয়নি। এছাড়াও, mysqlপরিষেবাটি পুনরায় চালু করা হয়েছে , তবে কোনও ভাল হয়নি।

কোন ধারনা? গুগল এখনও পর্যন্ত আমাকে ব্যর্থ করেছে। ধন্যবাদ।

অতিরিক্ত তথ্য:

mysql> SHOW engine innodb STATUS;
------------------------
LATEST FOREIGN KEY ERROR
------------------------
140703 15:15:09 Error in foreign key constraint of table my_db/my_user
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT "FK_CFBD431E285FAC6D" FOREIGN KEY ("group_id") REFERENCES "my_group" ("id")

1
আপনি কি নিশ্চিত যে আপনার কোথাও টাইপো নেই? আপনি বলছেন যে আপনি টেবিল তৈরি করছেন my_userতবে ত্রুটিটি প্রায় my_db.user...
মাস্তাকিয়ো

@ মুস্তাকসিও, হ্যাঁ একটি টাইপ করেছে যখন আমার_উজারে টেবিলের নামটি সংক্ষিপ্ত করার সময় (মূলটির দীর্ঘতর, বিভ্রান্তিকর নাম রয়েছে)। আসলে CREATE TABLEকোডটি ডক্ট্রিন ওআরএম লাইব্রেরি (পিএইচপি) দ্বারা উত্পন্ন হয়।
noisebleed

সুতরাং, এটি প্রকৃত নাম নয়, আপনি কেবল আমাদের
জ্বালাতন

আপনি যদি InnoDB অভিধানে রেকর্ডটি পরিত্যাগ করেছেন তবে এটি আপনাকে একই নামের সাথে সারণী তৈরি করতে দেয় না। আপনার কেস দেখে মনে হচ্ছে, তবে আরও তদন্ত দরকার। জাল my_user.frm এবং my_user.ibd রাখার চেষ্টা করুন এবং টেবিলটি ফেলে দিন।
আকুজিনস্কি

প্রকৃত টেবিলের নামটির কোনও অদ্ভুত অক্ষর আছে (বর্ণানুক্রমিক নয়)? এটি কি কোনও অঙ্ক বা অদ্ভুত চরিত্র দিয়ে শুরু হয়?
ypercubeᵀᴹ

উত্তর:


7

InnoDB আর্কিটেকচার

InnoDB আর্কিটেকচার

বিশ্লেষণ

  • একরকম, আপনি ফাইল my_user.frmএবং my_user.ibdফাইলগুলি হারিয়েছেন । তথ্যের অভিধানটিতে এখনও সেই টেবিলটির জন্য একটি প্রবেশিকা রয়েছে।
  • আপনি চালাতে পারবেন না DROP TABLE my_user;কারণ মাইএসকিএলডি my_user.frmপ্রথমটির সন্ধান করে। যেহেতু এটি না my_user.frm, সারণীটি বাদ দেওয়া যায় না।
  • যদিও my_user.frmএটি বিদ্যমান নেই, আপনি চালাতে পারবেন না CREATE TABLE my_user ...কারণ মাইএসকিএলডি টেবিলটি তৈরি করা ঠিক বলে মনে করে তবে স্টোরেজ ইঞ্জিনে পিছিয়ে যায়। ইনোডিবি বলেছে "আমার ইতিমধ্যে আমার_উজারের টেবিলস্পেস_আইজিটি নিবন্ধিত আছে"।

আপনি মাইআইএসএএম ব্যবহার করে টেবিল তৈরি করলে ইভেন্টগুলির এই ক্রমটি প্রমাণিত হতে পারে। mysqld এটি অনুমতি দেবে। একবার আপনি ইনোডিবিতে স্যুইচ করলে, এটি সরাসরি ডেটা ডিকশনারিতে ফিরে যায়, যা সেই একটি এন্ট্রিতে ত্রুটিযুক্ত।

আমার দুটি পরামর্শ আছে

পরামর্শ # 1

এই নামটি দিয়ে আর টেবিল তৈরি করবেন না। একটি আলাদা টেবিলের নাম ব্যবহার করুন

CREATE TABLE my_usertable (id INT AUTO_INCREMENT NOT NULL, username VARCHAR(255), group_id VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

এর ফলে আপনি আপনার অ্যাপ্লিকেশন কোডের সারণির নাম পরিবর্তন করতে পারবেন

পরামর্শ # 2

আমি আমার পোস্টের আগে এই সমস্যাটি মোকাবিলা করেছি ইনোডিবি টেবিলটি নির্বাচন করুন ERROR 2006 (HY000) প্রদান করুন: মাইএসকিউএল সার্ভার চলে গেছে (বিদ্যুৎ বিভ্রাটের পরে)


# 1 দুর্দান্ত উত্তর, বিস্তারিত জানার জন্য আপনাকে ধন্যবাদ। # 2 মাইস্কুলডাম্প (এডি), মাইএসকিএলডি থামিয়েছে, আইবডাটা 1 সরিয়েছে, আবার পুনঃসূচনা করলেও সফলভাবে আরম্ভ করার জন্য ডিমনটি পেতে পারে না। কী চলছে তা আরও ভাল করে বুঝতে হবে।
'45 এ শোরগোল ছড়িয়েছে

ঠিক আছে, এখন সবকিছু কাজ করছে। এছাড়াও অপসারণ করতে হবে ib_logfile0এবং ib_logfile1(পাশাপাশি ibdata1)। আমদানির পরে আমি my_userকোনও সমস্যা ছাড়াই টেবিলটি তৈরি করতে পারতাম । আপনাকে রোল্যান্ডো ধন্যবাদ!
শোরগোল ছড়িয়েছে

আমি এখন অন্য দুটি টেবিল হারিয়েছি। আমি প্রতিটি সম্পাদিত ক্যোয়ারী রেকর্ড করছি এবং সেই টেবিলগুলি ব্যবহার করে সরানো হয়নি DROP TABLE। কিছু ভুল হচ্ছে।
noisebleed

ধন্যবাদ। একই সঠিক সমস্যা আছে। আমার ডাটাবেসে 1 টি টেবিল অনুপস্থিত এবং আমি ব্যাকআপ থেকে এটি পুনরুদ্ধার করতে পারি না কারণ আমি টেবিলটি তৈরি করতে পারি না।
জিগিহ আজি ইব্রাহিম

5

আমার সমাধানটি যুক্ত করতে যেমন আমার একই সমস্যা ছিল।

টি এল; ডিআর

  • একই বিদেশী কী স্পেসিফিকেশনের সাথে টেবিলটি পুনরায় তৈরি করুন তবে আগের টেবিলে রাখা আলাদা নামের সাথে।
  • ফলাফলের টেবিলটি ফেলে দিন (মূল অনাথ বিদেশী কীটিও বাদ যাবে)
  • আসল বা কোনও বিদেশী কী সহ টেবিলটি পুনরায় তৈরি করুন

বিস্তারিত

আমি সেই ন্যক্কারজনক পরিস্থিতিতে ছুঁড়েছি যেখানে বিদেশী কী বাদ পড়েছে না বলে একটি অল্টার টেবিল স্টেটমেন্ট ব্যর্থ হয়েছে। এটি InnoDB ডেটা অভিধানে কিছু অসঙ্গতি সৃষ্টি করেছিল (সম্ভবত http://bugs.mysql.com/bug.php?id=58215 এর কারণে )।

সম্পর্কিত প্রশ্ন এখানে: /programming/16857451/error-in-foreign-key-constraint-on-a-DPed-table

mysql> ALTER TABLE `visits` CHANGE COLUMN `variation_visitor_id` `variation_visitor_id` INT(11) NOT NULL  ;

'./Db/#sql-482c_8448f' থেকে './db/visits' এর নাম পরিবর্তন করার সময় ত্রুটি (ভুল: 150)

mysql> SHOW ENGINE INNODB STATUS;

Error in foreign key constraint of table db/visits:
 FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html 
for correct foreign key definitippon.

আমি পরিদর্শন করতে # sql-482c_8448f টেবিলটি পুনরুদ্ধার করতে না পারায়, আমি পরিবর্তনের ঠিক আগে সম্পন্ন ব্যাকআপ থেকে এটিকে পুনর্বহাল করার সিদ্ধান্ত নিয়েছি। তবে এটি ব্যর্থ হয়েছে। তদন্তে:

  • প্রতিবন্ধকতা INFORMATION_SCHEMA.TABLE_CONSTRAINTS এবং INFORMATION_SCHEMA.STATISTICS থেকে সরিয়ে দেওয়া হয়েছিল
  • তবে এই সীমাবদ্ধতা এখনও INFORMATION_SCHEMA.INNODB_SYS_FOREIGN এ দৃশ্যমান ছিল;
  • টেবিলটি বিদ্যমান ছিল না তাই আমি বিদেশী কীটি ফেলে দিতে পারিনি
  • আমি ত্রুটি ছাড়াই টেবিলটি তৈরি করতে পারি না

এসকিউএল / ত্রুটি

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN WHERE ID='db/fk_visits_variations_visitors1';

+-----------------------------------+-----------+------------------------+--------+------+
| ID                                | FOR_NAME  | REF_NAME               | N_COLS | TYPE |
+-----------------------------------+-----------+------------------------+--------+------+
| db/fk_visits_variations_visitors1 | db/visits | db/variations_visitors |      1 |   48 |
+-----------------------------------+-----------+------------------------+--------+------+

বিদেশী কী ছাড়াই টেবিলটি পুনরায় তৈরি করার চেষ্টা করার ফলে ane ত্রুটি 150 হয়

mysql>

SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `visits` (
  `id` INT(11) NOT NULL AUTO_INCREMENT  ,
  `variation_visitor_id` INT(11) NOT NULL  ,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;

ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 150)

mysql> SHOW ENGINE INNODB STATUS;

Error in foreign key constraint of table db/visits:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT "fk_visits_variations_visitors1" FOREIGN KEY ("variation_visitor_id") REFERENCES "variations_visitors" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION

এটি তৈরি করার চেষ্টা করে একটি ত্রুটি 121 তৈরি করেছে

mysql>

SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `visits` (
  `id` INT(11) NOT NULL AUTO_INCREMENT  ,
  `variation_visitor_id` INT(11) NOT NULL  ,
  PRIMARY KEY (`id`),
  KEY `fk_visits_variations_visitors1` (`variation_visitor_id`),
  CONSTRAINT `fk_visits_variations_visitors1` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;

ERROR 1005 (HY000) at line 26: Can't create table 'db.visits' (errno: 121)

mysql> SHOW ENGINE INNODB STATUS;

Error in foreign key constraint creation for table `db`.`visits`.
A foreign key constraint of name `db`.`fk_visits_variations_visitors1`
already exists. (Note that internally InnoDB adds 'databasename'
in front of the user-defined constraint name.)
Note that InnoDB's FOREIGN KEY system tables store
constraint names as case-insensitive, with the
MySQL standard latin1_swedish_ci collation. If you
create tables or databases whose names differ only in
> the character case, then collisions in constraint
names can occur. Workaround: name your constraints
explicitly with unique names.

অবশেষে আমি একটি নতুন বিদেশী কী নাম ব্যবহার করেছি। আমি এটি কাজ করবে বলে আশা করছিলাম না তবে এটি সারণীটি তৈরি করার অনুমতি দিয়েছে।

mysql>

SET UNIQUE_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE `visits` (
  `id` INT(11) NOT NULL AUTO_INCREMENT  ,
  `variation_visitor_id` INT(11) NOT NULL  ,
  PRIMARY KEY (`id`),
  KEY `fk_visits_variations_visitors2` (`variation_visitor_id`),
  CONSTRAINT `fk_visits_variations_visitors2` FOREIGN KEY (`variation_visitor_id`) REFERENCES `variations_visitors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SET FOREIGN_KEY_CHECKS = 1;
SET UNIQUE_CHECKS = 1;

কেবলমাত্র বিদেশী কী নামের সাথে আমদানির অনুমতি দিয়ে INFORMATION_SCHEMA.INNODB_SYS_FOREIGN এ ভুল রেকর্ড সরিয়ে দেওয়ার পরে কেবল টেবিলটি ফেলে দেওয়া হচ্ছে ping


1

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


0

আমার জন্য যা কাজ করেছিল তা হ'ল:

  • প্রথমে .frm এবং .ibd ফাইলগুলিকে অন্য ডিয়ারে সরান, যেমন / tmp / টেবিলব্যাকআপ *
  • এখন mysqlfrmওরাকল এর mysql-utitilies** থেকে .frm ফাইল থেকে টেবিলের কাঠামোটি বের করা হচ্ছে (কারণ আমার কাছে কাঠামোর কোনও অনুলিপি / ব্যাকআপ ছিল না) উদাহরণস্বরূপ:/usr/bin/mysqlfrm --diagnostic /tmp/tablebackup/MyTable.frm
  • মূল টেবিলের কাঠামো দিয়ে তবে একটি আলাদা নামের সাথে একটি নতুন টেবিল তৈরি করুন (উদাহরণস্বরূপ, ইস্যুটি দিয়ে টেবিলটি বলতে পারি MyTableতবে আমি এখন MyTableBমূল টেবিলের কাঠামো সহ একটি সারণী তৈরি করেছি )
  • পরবর্তী মাইএসকিউএল মধ্যে থেকে আসল নাম সারণীর নামান্তর, যেমন: RENAME TABLE `MyTableB` TO `MyTable`;(নোট যে এই শুধুমাত্র কাজ যদি আপনি না না আছে innodb_force_recoveryআপনার সেট my.cnf)
  • এখন মাইএসকিএল রান: ALTER TABLE `MyTable` DISCARD TABLESPACE;
  • তারপর কপি মূল .ibdফাইল (শুধুমাত্র .ibd ফাইল, না .frm ফাইল) MySQL ডেটাবেস Dir যেখানে এটি মূলত থেকে সরিয়ে নেওয়া হয়েছে ফিরে (সেখানে এই মুহূর্তে একটি বিদ্যমান .ibd ফাইল কারণ যে অপসারণ পায় থাকা উচিত নয় DISCARD TABLESPACEকমান্ড)
  • এবং এখন চালান ALTER TABLE `MyTable` IMPORT TABLESPACE;

* আমি এই পদক্ষেপের পরে মাইএসকিএল পুনরায় চালু করেছি তবে নিশ্চিত নয় যে এটি প্রয়োজনীয়

** মাইএসকিএল-ইউটিলিটিগুলির জন্য mysql-connector-pythonপ্রথমে ইনস্টল করার প্রয়োজন হতে পারে


0

আপনি টেবিলের ডেটা হারিয়েছেন, তবে এই টেবিলটি সম্পর্কে রেকর্ডটি এখনও "মাইএসকিএল / ডেটা / আইবডাটা 1" তে বিদ্যমান রয়েছে। আরও সহজ সমাধান হ'ল এই টেবিলটি অন্য কোনও ডাটাবেসে তৈরি করা এবং তারপরে ফাইলগুলি অনুলিপি করা:

mysql/data/**dummy_database**/my_user.frm

mysql/data/**dummy_database**/my_user.ibd

আপনার নিজস্ব:

mysql/data/**yours_database**/my_user.frm

mysql/data/**yours_database**/my_user.ibd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.