Свободная СУБД MySQL
Собственность Oracle
Последняя версия 5.5.16 (15 сентября 2011)
Официальный сайт: http://www.mysql.com/
В версии 5.6 Oracle обещала реализовать полнотекстовый поиск для таблиц InnoDB
(C) http://emeapressoffice.oracle.com/Press-Releases/Oracle-Provides-Early-Access-to-MySQL-5-6-New-Features-201d.aspx
http://ru.wikipedia.org/wiki/MySQL -вики
http://dev.mysql.com/doc/index.html - документация по MySQL
mysql -V -посмотреть версию mysql
Полезные файлы
/etc/mysql/my.cnf - файл конфигурации в одном дистрибутиве
или
/etc/mysql/mariadb.conf.d/50-server.cnf - файл конфигруации в другом дистрибутиве
В файлах конфигурации прописаны пути к другим файла - лог-файлу ошибок или к файлу, в который выводятся медленные запросы
Поэтому в первую очередь нужно ознакомиться с конфигурационным файлом, поскольку в разных дистрибутивах пути к логам и настройки, естественно разные.
Для Stretch лог-файл с ошибками лежит здесь: /var/log/mysql/error.log
/var/lib/mysql — традиционное место для баз данных(задается в конфигурационном файле)
Отслеживание медленных запросов:
добавить следующие строки в /etc/my.cnf
log-slow-queries=/tmp/slow_queries.log
long_query_time=3
Установка MySQL
# aptitude install mysql-server mysql-client
Команды MySQL
mysql -u userName -p -соединиться с сервером, интерактивно вводя пароль
mysql -u userName -pPASSWORD -соединиться с сервером, пароль вводится непосредственно в командной строке без пробела
Смена пароля root
#mysql -u root mysql;
#mysql> USE mysql;
#mysql> UPDATE user SET Password=PASSWORD('new-password') WHERE user='root';
#mysql> FLUSH PRIVILEGES;
'Access denied for user 'root'@'localhost''
Пароль заранее известен, пароль верный, но mysql нас не пускает к себе. Со вторым пользователем phpmyadmin, который у нас в данный момент есть авторизация проходит.
MariaDB [mysql]> select user,password,plugin from user;
+------------------+-------------------------------------------------------------------------+-------------+
| user | password | plugin |
+------------------+-------------------------------------------------------------------------+-------------+
| root | *296FA13173A42EB943E48A3ED5749BDF821E2151 | unix_socket |
| phpmyadmin | *296FA13173A42EB943E48A3ED5749BDF821E2151 | |
Выполняем следующие манипуляции:
#mysql -u root mysql;
#mysql> USE mysql;
#mysql> UPDATE user SET plugin='' WHERE user='root';
#mysql> FLUSH PRIVILEGES;
#mysql> exit;
Проблема решена
Дамп базы данных из mysql
mysqldump --default-character-set=utf8 -u user123 -h localhost -pВотТутПароль example_db > example_db.sql - работает
mysqldump --default-character-set=utf8 example_db > example_db.sql -u user123 -pВотТутПароль - также работает
Между -p и паролем нет пробела
Загрузка данных в MySQL
а)
mysql -uroot -pXXX -hlocalhost web < web.sql - сразу создаем и загружаем базу(если есть в скрипте ее создание)
б)
из командной строки после логина из пункта а)
mysql> create database xxx; - создание базы
mysql> use xxx; - выбор
mysql> source data.sql; - загрузка в нее файла data.sql напрямую из текущей папки ОС
Настройка MySQL
Опции хранятся в файле /etc/mysql/my.cnf
В разделе [mysqld]
задаем строчки
default-character-set = utf8
init-connect="SET NAMES utf8"
Директива не работает при коннекте к базе пользователем с правами рута!! Поэтому задаем пользователя c ограниченными правами
Делаем рестарт MySQL:
sudo /etc/init.d/mysql restart
Просмотреть уровень изоляции транзакции в innoDB MySQL
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
SET GLOBAL tx_isolation='REPEATABLE-READ';
SET SESSION tx_isolation='SERIALIZABLE';
Lock Tables и Транзакции в MySQL уживаются плохо между собой в MySQL(InnoDB)
Консольные команды для MySQL
# /etc/init.d/mysql stop | start | restart - остановить, запустить, перезапустить сервер БД
Пути к файлам MySQL
/var/lib/mysql — путь к базам данных, имя папки - соответствует названию базы
Перенос БД InnoDB на другой сервер
Если упал сервер и у нас нет бэкапа, то можно попытаться поднять БД на другом сервере MySQL
а) Копируем файлы БД, лежащие в папке /var/lib/mysql/database_to_restore
б) Копируем файл ibdata1 из папки /var/lib/mysql/ (содержит данные о всех базах InnoDB)
в) Убеждаемся, что владелец файлов такой же, как и у всех остальных БД на сервере (обычно mysql/mysql)
Полезные команды
# /etc/init.d/mysql start
$ mysqladmin –u root –p ping - проверка, запущен ли mysql
$ mysqladmin -u root -p status - статус сервера
$ mysqladmin –u root –p variables >> file.txt – выводит параметры MySql-сервера в файл
$ mysqladmin –u root –p shutdown - остановка mysqld
mysql> select host, db from mysql.db; - показать список баз данных
mysql>SELECT DATABASE(); - посмотреть имя текущей базы данных
Как восстановить удаленного root:
Прибиваем процесс:
/var/ran/mysqld — папка, где находится pid-файл процесса mysqld, чтобы убить процесс, выясняем его номер при помощи комманды ps ax|grep my — выбираем тот процесс, где упоминается этот pid файл: sudo kill 7777. Доказательством исчезнувшего процесса будет исчезнувший pid файл и пустой запрос по списку запущенных процессов ps ax|grep my
sudo killall mysqld — второй способ
запускаем sudo mysqld - - skip-grant-tables — сервер в режиме «без привилегий», после чего мы можне зайти в консоль(хоть дедом морозом :)):
подключаемся к mysql и выполняем запросы на добавление пользователя в базу:
INSERT INTO mysql.user (Host, User, Password) VALUES ('localhost', 'root', PASSWORD('xxxxxx')); - добавляем пользоавтеля.
UPDATE mysql.user SET Select_priv = 'Y', Super_priv = 'Y', Grant_priv = 'Y' WHERE user='root'; - добавляем ему некоторые права
FLUSH PRIVILEGES; перегружаем mysql в режиме с контролем привилегий
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; (сразу после добавления пользователя root работать не будет)
FLUSH PRIVILEGES; - вуаля, горе-админ восстановлен
//update mysql.user set password=password('xxxxxx') where user='root'; flush privileges;
Полезные команды для выяснения параметров кодировки и сравнения:
SHOW GLOBAL VARIABLES LIKE 'char%';
SHOW GLOBAL VARIABLES LIKE 'collation%';
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'collation%';
---------хостнигн.ru------------------------------------------------начало
Результат выполнения запроса SHOW GLOBAL VARIABLES LIKE 'char%';(для хостинга хостинг.ru, также для данного хостинга в файл .htaccess добавляем
AddDefaultCharset utf-8, поскольку для данного хостинга кодировка по умолчанию windows-1251):
Variable_name Value
character_set_client cp1251
character_set_connection cp1251
character_set_database cp1251
character_set_results cp1251
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/local/share/mysql/charsets/
---------хостинг.ru------------------------------------------------конец
---------хостинг2.ру---------------------------------------------начало
character_set_client cp1251
character_set_connection cp1251
character_set_database cp1251
character_set_filesystem utf8
character_set_results cp1251
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
---------хостинг2.ру---------------------------------------------конец
Первый случай:
В my.cnf, раздел [mysqld] необходимо прописать строку:
Код:
init-connect="SET NAMES utf8"
Также следует поправить данную директиву:
Код:
default-character-set=utf8
Второй случай:
Необходимо найти в скрипте место вызова функции mysql_connect() и сразу после нее добавить строку:
Код:
mysql_query('SET NAMES utf8');
-------Создание пользователя - начало
USE mysql;
INSERT INTO user (Host, User, Password) VALUES ('localhost', 'cart_user', PASSWORD('374'));
GRANT SELECT , INSERT , UPDATE , DELETE , CREATE TEMPORARY TABLES , LOCK TABLES , CREATE VIEW , SHOW VIEW , EXECUTE ON `plaincart` . * TO 'cart_user'@'localhost' WITH GRANT OPTION ;
FLUSH PRIVILEGES;
--------Создание пользователя - конец
Hint
При изменении кодировок-сравнений для отдельных полей таблицы, можно в phpmyadmin задать кодировку для таблицы, а
затем обнулить значения кодировок для отдельных полей. В этом случае отдельные поля таблицы приобретут знечение кодировки,
заданное для таблицы
Документация по воросу:
http://dev.mysql.com/doc/refman/5.1/en/charset.html