ارتقاء به MySQL 8.0 با حذف پشتیبانی از دیتاتایپهای Temporal قدیمی
ارتقاء به MySQL 8.0 با حذف پشتیبانی از نوعدادههای[۱] Temporal (تمپورالِ) قدیمی
MySQL 5.6 دقت ثانیهای کسری [۲] را برای نوعدادههای موقتی مانند TIME، DATETIME و TIMESTAMP تا دقت میکروثانیهای ۶ رقمی فراهم کرد. علاوه بر فراهم کردن دقت ثانیهای کسری، پیادهسازی جدید تمپورالها [۳] ازلحاظ دیسک مؤثرند.
«تمپورال قدیمی» چیست؟
تمپورالهای قدیمی مربوط به ستونهای نوع موقتی (تمپورال) در جدولهایی هستند که در نسخههای ۵.۵ و پایینترِ MySQL ساخته میشوند. هر جدول جدیدی که بعد از MySQL 5.6.4 (DMR) با انواع موقتی ساخته شود، بهطور خودکار دقت ثانیهای کسری دارد. هر دستورِ ALTER که جدول را مجدداً میسازد، بهطور خودکار تمپورالها را به تمپورالهایی با دقت ثانیهای کسری تبدیل میکند. اما تمپورالهای قدیمی را میتوان با ارتقاء درجا [۴] و استفاده از avoid-temporal-upgrade برای کاربرانی که از MySQL 5.5 میآیند حفظ کرد. پرسمانهای زیر [۵] برای بررسی این هستند که آیا در پایگاهدادههای شما هیچ تمپورال قدیمیای باقی مانده است:
چه چیزی تغییر میکند؟ چرا تمپورالهای قدیمی NOW() را بررسی کنیم؟ تمپورالهای قدیمی از msql-5.6 منسوخ [۶] شدهاند اما از MySQL 8.0 به بعد پشتیبانی نمیشوند. بهاینترتیب اگر در پایگاه دادههای شما انواع قدیمی تمپورال وجود داشته باشد، ارتقاء درجا [۷] از MySQL 5.7 به MySQL 8.0 امکانپذیر نیست.
چگونه تمپورالهای قدیمی را درست کنیم؟
تمام جدولهایی را که تمپورالهای قدیمی دارند شناسایی میکنید. حال باید چه کنیم؟ هر دستورِ ALTER که جدول را دوباره میسازد یا دستورِ REPAIR TABLE، تمپورالهای قدیمی را به تمپورالها با دقت ثانیهای کسری تبدیل میکنند. بیشتر کاربران با اجرای mysql_upgrade بعد از ارتقاء به MySQL 5.7 (ارتقاءِ درجا[۸]) میتوانند انواع قدیمی تمپورال را تصحیح کنند؛ اما اگر توانستید تمپورالهای قدیمی در MySQL 5.7 با استفاده از –avoid-temporal-upgrade حفظ کنید، با متدهایی که اینجا ارائه میشوند میتوانید تمپورالهای قدیمی در mysql -5.7 را ارتقاء بدهید.
استفاده از فرمان ALTER
جدول را با استفاده از فرمانِ ALTER TABLE <table_name> FORCE بسازید.
از هر عملیات همزمانی بر جدولی که در حال تغییر است ممانعت میشود.
استفاده از ابزار
وقتی اندازۀ جدولِ تغییریافته کوچک است، فرمانِ ALTER برای تبدیل تمپورالهای قدیمی به تمپورالها با دقت ثانیهای کسری عملی است. برای جدولهای بسیار بزرگ، فرمانِ ALTER زمان بسیار زیادی میگیرد. تبدیل یک جدولی که اندازۀ یک تِرابایتی دارد با دستور alter میتواند چند روز وقت بگیرد. برای جلوگیری از مسدود کردن جدول برای مدت طولانی، استفاده از ابزار جانبی برای ساخت یک جدول جدید، همراه با ترافیک طبیعی در جدول قدیمی رجحان دارد. شاید وقتیکه تعویض جدولها صورت میگیرد (تبدیل در حین آنلاین بودن)، در دورۀ کوتاهی انسداد ایجاد شود. میتوان از ابزاری مثل Gh-ost برای تغییر آنلاین پیشنویس استفاده کرد.
دستور زیر تمپورالهای قدیمی را بر سروری که با گزینۀ –log-bin شروع به کار میکند، به تمپورالهایی با دقت ثانیهای کسری تبدیل میکند (گزینۀ –log-bin برای Gh-ost لازم است).
قبل از انجام هر عملیاتی بر جدول پیشنهاد میشود که مستند مرتبط را بخوانید و از سرور تولیدی [۹] یک نسخۀ پشتیبان [۱۰] تهیه کنید و اول در یک سرور غیرتولیدی امتحان کنید.
نتیجهگیری
شایانذکر است که این منسوخ شدن بر کاربرانی که با یک نسخۀ پشتیبان منطقی (مانند mysqldump) ارتقا مییابند تأثیری نمیگذارد بلکه ارتقای درجا [۱۱] از پایگاه دادههایی که از MySQL 5.5 و نسخههای قدیمیتر استفاده میکنند میتواند مشکلساز باشد. با حذف پشتیبانی از تمپورالهای قدیمی میتوانیم بخشی از پیچیدگی را از کدبیس خود از میان ببریم و زمان بیشتری را برای توسعۀ ویژگیهای جدید آزاد کنیم.
———————————————————————————–
[۱] DataType
[۲] fractional second precision
[۳] temporal
[۴] In-place upgrade
زمانی که ارتقاء یا بهروزرسانی با نصب یک سیستمعامل یا برنامۀ کاربردی بر رایانه، بدون حذف نسخۀ قدیمی اولیه و ذخیرۀ دادهها (به جز آنچه برای احتیاط ذخیره میشود) صورت میگیرد.
[۵] query
[۶] Deprecate
[۷] زیرنویس۴
[۸] زینویس ۴
[۹] Backup production
[۱۰] backup
[۱۱] زیرنویس ۴
آموزش خوبی بود، ممنون