Advertisement
load-net

MySQL and ibdata1

Feb 25th, 2025
17
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.03 KB | None | 0 0
  1. ;;;;;;; Борьба с разросшимся ibdata1 файлом MySQL
  2. ;;;;;;; Случилась недавно проблемка. Получил уведомление о том, что на рабочем сервере заканчивается свободное место. Был слегка удивлен, ведь на нем хостились всего лишь тестовые версии сайтов, для демонстрации клиентам.
  3. ;;;;;;;
  4. ;;;;;;; Пришлось локализовать «распухшее» место программой du:
  5. ;;;;;;; # ищем переростка в корне директории больше 200 Мб
  6. ;;;;;;; $ du -sh /* --threshold=200M | sort -h
  7. ;;;;;;;
  8. ;;;;;;; # ищем в следующей самой жирной директории, например
  9. ;;;;;;; $ du -sh /var/* --threshold=200M | sort -h
  10. ;;;;;;;
  11. ;;;;;;; # ... и так далее, пока не локализуем виновника
  12. ;;;;;;; В моем случае это оказался файл ibdata1 — файл с базами данных.
  13. ;;;;;;; Как выяснилось, до 5.6.6, MySQL по умолчанию не «резала» таблицы и базы на отдельные папки и файлы, а сохраняла все в один файл.
  14. ;;;;;;;
  15. ;;;;;;; Данные эти мне не нужны, поэтому TRUNCATE и дело с концом.
  16. ;;;;;;;
  17. ;;;;;;; И вот тут меня ждал очень неприятный сюрприз — размер файла ibdata1 не уменьшился вообще.
  18. ;;;;;;; ALTER TABLE <...> ENGINE=innodb не помогло. OPTIMIZE TABLE <...> — тоже.
  19. ;;;;;;;
  20. ;;;;;;; Решение
  21. ;;;;;;; Нашел решние на Stackoverflow.
  22. ;;;;;;; Оказалось, что это, типа, так и должно быть. Файл можно уменьшить только удалив ibdata1 и ib_log.
  23. ;;;;;;;
  24. ;;;;;;; 1. Делаем дамп базы
  25. ;;;;;;; Надо учесть, что базы mysql и performance_schema мы удалять не будем.
  26. ;;;;;;; Самый простой способ, если баз не так много:
  27. ;;;;;;;
  28. ;;;;;;; $ mysqldump -uroot -proot --databases db_name1 [db_name2 db_name3...] > dump.sql
  29. ;;;;;;; Если баз много, то можно воспользоваться такой конструкцией:
  30. ;;;;;;;
  31. ;;;;;;; $ echo 'show databases;' | mysql -uroot -proot | grep -v ^mysql$ | grep -v ^performance_schema$ | xargs mysqldump -uroot -proot --databases > dump.sql
  32. ;;;;;;; Если баз, которые хочется исключить, больше двух, то можно, конечно, все их перечислить в примере выше. Но как по мне, так увеличивается вероятность ошибиться.
  33. ;;;;;;; Поэтому я предлагаю сделать 3 простых шага:
  34. ;;;;;;;
  35. ;;;;;;; # 1. получаем список всех таблиц в файл
  36. ;;;;;;; $ echo 'show databases;' | mysql -uroot -proot > dblist.txt
  37. ;;;;;;; # 2. удалить из этого файлика все ненужные таблицы
  38. ;;;;;;; # 3. Сделать дамп
  39. ;;;;;;; $ cat dblist.txt | xargs mysqldump -uroot -proot --databases > dump.sql
  40. ;;;;;;; 2. Удаляем все базы данных.
  41. ;;;;;;; КРОМЕ mysql и performance_schema
  42. ;;;;;;;
  43. ;;;;;;; $ mysql -uroot -proot
  44. ;;;;;;; mysql > DROP DATABASE db_name1;
  45. ;;;;;;; mysql > DROP DATABASE db_name2;
  46. ;;;;;;; ...
  47. ;;;;;;; mysql > DROP DATABASE db_nameN;
  48. ;;;;;;; Важно из справки по DROP DATABASE
  49. ;;;;;;; Оператор DROP DATABASE удаляет все таблицы в указанной базе данных и саму базу. Если вы выполняете DROP DATABASE на базе данных, символически связанной с другой, то удаляется как ссылка, так и оригинальная база данных. Будьте ОЧЕНЬ внимательны при работе с этой командой!
  50. ;;;;;;;
  51. ;;;;;;; 3. Тормозим mysql
  52. ;;;;;;; Ubuntu:
  53. ;;;;;;;
  54. ;;;;;;; $ sudo service mysqld stop
  55. ;;;;;;; ## или
  56. ;;;;;;; $ sudo service mysql stop
  57. ;;;;;;; CentOS 7
  58. ;;;;;;;
  59. ;;;;;;; $ sudo systemctl stop mysqla
  60. ;;;;;;; 4. Исправляем конфиг my.cnf
  61. ;;;;;;; mcedit \etc\mysql\my.cnf....
  62. ;;;;;;; Чтобы найти все места откуда забирается конфиг, можно выполнить следующую команду:
  63. ;;;;;;;
  64. ;;;;;;; $ mysql --help
  65. ;;;;;;; По идее, вы должны будете увидеть нечто подобное (строки 8-9):
  66. ;;;;;;;
  67. ;;;;;;; $ mysql --help
  68. ;;;;;;;
  69. ;;;;;;; mysql Ver 15.1 Distrib 10.3.20-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
  70. ;;;;;;; Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
  71. ;;;;;;;
  72. ;;;;;;; Usage: mysql [OPTIONS] [database]
  73. ;;;;;;;
  74. ;;;;;;; Default options are read from the following files in the given order:
  75. ;;;;;;; Слеши в обратном порядке потому что паста не поддерживает это
  76. ;;;;;;; \etc\my.cnf \etc\mysql\my.cnf ~\.my.cnf
  77. ;;;;;;; ...
  78. ;;;;;;; ...
  79. ;;;;;;; После того, как нашли конфиг, в него нужно найти секцию [mysqld] и добавить (или исправить, если есть) значение параметра:
  80. ;;;;;;;
  81. ;;;;;;; innodb_file_per_table=1
  82. ;;;;;;; 5. Удаляем файлы ibdata1 и ib_log
  83. ;;;;;;; 6. Стартуем mysql
  84. ;;;;;;; Ubuntu:
  85. ;;;;;;;
  86. ;;;;;;; $ sudo service mysqld start
  87. ;;;;;;; ## или
  88. ;;;;;;; $ sudo service mysql start
  89. ;;;;;;; CentOS 7
  90. ;;;;;;;
  91. ;;;;;;; $ sudo systemctl start mysql
  92. ;;;;;;; 7. Восстанавливаем дамп
  93. ;;;;;;; $ mysql -uroot -proot < dump.sql
  94. ;;;;;;; Profit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement