Tag Archives: SQL

MySQL шпаргалки

Часто, когда разрабатываешь сайт, замечаешь, как на одни и те же грабли наступают разработчики при проектировании базы данных.

Сегодня я решил опубликовать свои шпаргалки, на самые часто встречающиеся ошибки при работе с MySQL.

Работа с бекапами

Делаем бекап
mysqldump -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql

Создаём структуру базы без данных
mysqldump —no-data — u USER -pPASSWORD DATABASE > /path/to/file/schema.sql

Если нужно сделать дамп только одной или нескольких таблиц
mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql

Создаём бекап и сразу его архивируем
mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz

Создание бекапа с указанием его даты
mysqldump -u USER -pPASSWORD DATABASE | gzip > date +/path/to/outputfile.sql.%Y%m%d.%H%M%S.gz

Заливаем бекап в базу данных
mysql -u USER -pPASSWORD DATABASE < /path/to/dump.sql

Заливаем архив бекапа в базу
gunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE
или так
zcat /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE

Создаём новую базу данных
mysqladmin -u USER -pPASSWORD create NEWDATABASE

Удобно использовать бекап с дополнительными опциями -Q -c -e, т.е.
mysqldump -Q -c -e -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql, где:

-Q оборачивает имена обратными кавычками
-c делает полную вставку, включая имена колонок
-e делает расширенную вставку. Итоговый файл получается меньше и делается он чуть быстрее

Для просмотра списка баз данных можно использовать команду:
mysqlshow -u USER -pPASSWORD

А так же можно посмотреть список таблиц базы:
mysqlshow -u USER -pPASSWORD DATABASE

Для таблиц InnoDB надо добавлять —single-transaction, это гарантирует целостность данных бекапа.
Для таблиц MyISAN это не актуально, ибо они не поддерживают транзакционность.

Подробнее

Общие факты

Полезно под каждую базу на боевом сервере создавать своего пользователя
Кодировка базы может быть любой, если она UTF8
В большинстве случаев лучше использовать движок InnoDB
В php лучше забыть про сильно устаревшее расширение mysql и по-возможности использовать pdo или mysqli
Новую копию MySQL всегда можно настроить и оптимизировать
Без особой нужды не стоит открывать MySQL наружу. Вместо этого можно сделать проброс портов
ssh -fNL LOCAL_PORT:localhost:3306 REMOTE_USER@REMOTE_HOST

Работа с данными

Числа

На 32-битных системах практически нет смысла ставить для типа INTEGER свойство UNSIGNED, так как такие большие числа в php не поддерживаются.
На 64-битных системах, php поддерживает большие числа, вплоть до MySQL BIGINT со знаком.
Связанные таблицы («Foreign keys») должны иметь полное сходство по структуре ключей. Т.е. если у нас на одной таблице для поля указано «INTEGER UNSIGNED DEFAULT 0 NOT NULL» то и на другой должно быть указано аналогично
Для хранения булевых значений, нужно использовать TINYINT(1)
А деньги лучше хранить в DECIMAL(10, 2), где первое число обозначает количество всех знаков, включая запятую, а второе — количество знаков после запятой. Итого, у нас получится что DECIMAL(10,2) может сохранить 9999999,99

Строки

В старых версиях (до 5.0.3) VARCHAR была ограничена 255 символами, но сейчас можно указывать до 65535 символов
Помните, что тип TEXT ограничен только 64 килобитами, поэтому что бы сохранять «Войну и Мир» пользуйтесь «LONGTEXT»
Самая правильная кодировка для вашей БД UTF8

Даты

Не забывайте, что

DATE, TIME, DATETIME — выводятся в виде строк, поэтому поиск и сравнение дат происходит через преобразование
TIMESTAMP — хранится в виде UNIX_TIMESTAMP, и можно указать автоматически обновлять колонку
Сравнивая типы данных DATETIME и TIMESTAMP, не забывайте делать преобразование типов, например:
SELECT * FROM table WHERE datetime = DATE(timestamp)

Перечисления

Для перечислений правильно использовать тип ENUM
Правильно пишется так: ENUM(‘мама’, ‘мыла’, ‘раму’)
Можно ставить значение по-умолчанию, как и для любой строки
В базе поле с перечислением хранится как число, поэтому скорость работы — потрясающе высокая
Количество перечислений ~ 65 тысяч
dev.mysql.com/doc/refman/4.1/en/storage-requirements.html
help.scibit.com/mascon/masconMySQL_Field_Types.html

Отладка

Если запросы тормозят, то можно включить лог для медленных запросов в /etc/mysql/my.cnf
А потом оптимизировать запросы через EXPLAIN
И наблюдать за запросами удобно через программу mytop

Пожалуйста, сообщите мне, если вы заметили неточность или есть желание поделиться советом или шпаргалкой.

Источник: https://habrahabr.ru/post/105954/

Предметная визуализация

Восстановление баз данных MySQL

Довольно часто базы данных MySQL «ломаются». В результате, приходится ремонтировать. Поломки баз данных происходят из-за не корректных выключений компьютера или сбоев в компьютере, когда сервер не может корректно закрыть файл. Следует отметить, что не все базы данных удаётся поремонтировать, поэтому, рекомендуется делать резервные копии rolleyes.gif

Есть несколько способов восстановления баз данных. И все они требуют, чтоб никто в это время не обращался к таблице базы данных, иначе предсказать последствия не возможно.

Самый простой способ восстановления — выполнить SQL-команду:
repair table <название таблицы>;
Данная команда восстановит таблицу в большинстве случаев.

Иногда, приходится использовать специальную утилиту для восстановления таблиц:
myisamchk -r -q <название таблицы> — режим быстрого восстановления файлов.
myisamchk -r <название таблицы> — режим восстановления файла.
myisamchk -r -f -o <название таблицы> — режим восстановления в защищенном режиме файла.

Разработка и создание сайтов, интернет-магазинов, веб-приложений, порталов, лэндингов, мобильных приложений (Киев)

Восстановление базы данных Postgresql

Автор: Рудюк С . А.
https://corp2.net

E-Mail: rs@corp2.net

Любая база данных выходит из строя… Пользователи забывают делать бекапы и как результат, программистам приходится возиться с восстановлением данных.
Ранее, я не однократно описывал восстановление баз данных Firebird (Interbase), но уже давно работаю с другими базами данных, поэтому, сталкиваюсь с «новыми задачами» по восстановлению информации.

Сегодня, ко мне обратился один старый клиент, у которого много лет работает база данных на Postgresql со вчерашнего дня у них стали выдаваться ошибки Page Error при входе в систему. Как результат — не возможность работы.
Зашел в PgAdmin, попробывал сделать бекап — вывались ошибки. Начал «передвигаться» по списку баз данных — вываливается огромное количество ошибок Page Error. Решили восстановить из бекапа. Как оказалось, последний бекап — за декабрь 2013 года. Пол-года пропало!
И тут меня осенило! Решил попробывать выполнить select. Проходит успешно, данные показывает без ошибки.
Ура! Подумал я себе.

Итак, как мне удалось восстановить базу без потери информации:
1. Создаю новую базу данных (с другим названием) из найденного бекапа (в данном случае, декабрь 2013г.). Проверяю входить в систему — всё отлично.
2. Сохраняю данные из каждой интересующей меня таблицы, подобными запросами:
copy (select * from zrp_zakaz ) to ‘d:\tmp\zrp_zakaz’;
3. Удаляю данные из необходимых таблиц в базе данных, которую восстановили. Например:
delete from zrp_zakaz;
4. Закачиваю данные из сохраненного файла в другой базе данных. Например:
copy zrp_zakaz from ‘d:\tmp\zrp_zakaz’;

Как результат — база восстановилась полностью, без потери данных.
Клиент счастлив, чего и следовало добиться…

Автор: Рудюк С . А. https://corp2.net

Разработка и создание сайтов, интернет-магазинов, веб-приложений, порталов, лэндингов, мобильных приложений (Киев)