Изменение значения по умолчанию в MySQL столбцах

Приведу пример указания или изменения значения по умолчанию в MySQL столбце.
Посмотрим список таблиц в базе данных:

SHOW TABLES;

Посмотрим структуру интересующей нас таблицы:

DESCRIBE internet_main;

Допустим колонка activate имеет тип date и значение по умолчанию 0000-00-00, а мы хотим сделать 3000-01-01, то выполним sql запрос:

ALTER TABLE internet_main ALTER activate SET DEFAULT '3000-01-01';

Можно также удалить значение по умолчанию:

ALTER TABLE internet_main ALTER activate DROP DEFAULT;

Или вернуть как было:

ALTER TABLE internet_main ALTER activate SET DEFAULT '0000-00-00';

В строгом режиме MySQL может не дать установить значение 0000-00-00, поэтому можно временно отключить строгий режим:

SET sql_mode = '';

Как запустить MySQL сервер на конкретных IP

Подходящим решением которое я нашел для запуска MySQL сервера на конкретных IP адресах, это запустить его на всех и потом отфильтровать подключаемых клиентов через iptables.

Для теста я использовал Ubuntu Server 16.04.5 LTS, который имел более 200 внешних белых IP и был высоконагруженным.

MySQL сервер был установлен так:

sudo apt-get install mysql-server mysql-client
mysql -V
mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper

К MySQL серверу нужен был доступ от localhost и нескольких адресов в интернете.
Поэтому я запустил MySQL сервер на всех IP, закомментировав «bind-address» в конфигурации:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
#bind-address = 127.0.0.1
#skip-networking
sudo service mysql restart

Создал пользователей для хостов с которых будут выполнятся подключения, более детально смотрите в моей статье — Как создать пользователя MySQL и настроить права доступа

Потом через iptables разрешил подключения только с нужных IP:

/sbin/iptables -A INPUT -s 127.0.0.1 -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.5 -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

Правило DROP должно быть только последним, если нужно еще добавить IP в iptables, то удалим DROP и в конце снова добавим:

/sbin/iptables -D INPUT -p tcp --dport 3306 -j DROP
/sbin/iptables -A INPUT -s 192.168.5.33 -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

Кстати, на тесте при попытке указать несколько адресов в bind-address, MySQL запускался только на последнем:

bind-address = 192.168.1.11
bind-address = 127.0.0.1

Как вариант, у меня возникает еще такая идея, запустить MySQL только на 127.0.0.1 (bind-address = 127.0.0.1), через iptables переадресовать на любой внешний IP, ну и потом правилами выше можно еще ограничить доступ):

sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp -d 192.168.1.11 --dport 3306 -j DNAT --to-destination 127.0.0.1:3306

Смотрите также мои статьи:
IPTables правила для MySQL
Установка и настройка MySQL сервера на Ubuntu

SQL запросы для ABillS

В этой статье я приведу примеры некоторых SQL запросов для базы биллинговой системы ABillS.

Первым делом подключимся к MySQL серверу и перейдем к базе abills (либо можно использовать phpmyadmin или внешний MySQL клиент):

mysql -u root
use abills;

Читать далее SQL запросы для ABillS

Скрипт добавления IP адресов из файла в ipset

Понадобилось однажды написать скрипт чтобы добавить в ipset все IP для которых били подняты сессии на сервере доступа, использовался биллинг Abills, поэтому я решил взять IP адреса из MySQL таблицы биллинга.

Первым делом создадим тестовый ipset:

ipset create test iphash

Создадим файл скрипта:

nano iplist.sh

Добавим в него содержимое:

mysql -u root -e "SELECT INET_NTOA(framed_ip_address) FROM abills.internet_online WHERE (status=1 or status>=3) AND guest=0;" -s -N > iplist.txt
iplist_data=$(cat iplist.txt)
for row_data in $iplist_data; do ipset -exist add test ${row_data}; done
rm iplist.txt

Выполняем скрипт и проверяем:

chmod +x iplist.sh
./iplist.sh
ipset list test | wc -l
ipset -L

Смотрите также мою статью — Скрипты ip-up и ip-down с ipset для Accel-ppp

Решение MySQL ERROR 1055 (42000)

Недавно выполнял необходимые SQL запросы и заметил следующую ошибку:

ERROR 1055 (42000): Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database_name.table_name.column_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Читать далее Решение MySQL ERROR 1055 (42000)

Как увидеть процесс импорта SQL файла?

Для того чтобы видеть процесс импорта SQL файлов я использую утилиту Pipe Viewer.
Pipe Viewer очень полезен особенно когда SQL файл большого размера, позволяет примерно оценить оставшееся время до завершения импорта файла, отображает процесс импорта в процентах и перешедшее время.

Установить Pipe Viewer в Ubuntu/Debian можно командой:

sudo apt install pv

В Fedora так:

yum install pv

Допустим раньше мы импортировали sql файл и не видели процесс:

mysql -u root DATABASE_NAME < dump.sql

Теперь чтобы увидеть процесс выполним импорт с использованием Pipe Viewer:

pv dump.sql | mysql -u root DATABASE_NAME

Как решить «ERROR 1062 (23000) at line X: Duplicate entry ?????? for key X»

Импортировал недавно дамп в MySQL и обнаружил следующую ошибку:

ERROR 1062 (23000) at line 14096: Duplicate entry '????????' for key 'name'

Читать далее Как решить «ERROR 1062 (23000) at line X: Duplicate entry ?????? for key X»

Решение ошибки с binary-mode при импорте MySQL dump из командной строки

Однажды решил импортировать sql дамп:

mysql -u root database < database.sql.gz

И заметил следующую ошибку:

ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: ''.

Ошибка появляется из-за того что дамп сжат и его необходимо сначала распаковать:

gunzip database.sql.gz

А потом импортировать:

mysql -u root database < database.sql

Смотрите другие мои статьи в категории MySQL

Настройка репликации в MySQL

На тесте выполню настройку репликации в MySQL.

Допустим имеется два сервера с установленной системой Ubuntu Server, на обеих установим MySQL сервер и клиент, если они не установлены:

sudo apt-get install mysql-server mysql-client

Читать далее Настройка репликации в MySQL

Решение ошибки ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

Выполнял однажды SQL запрос:

GRANT REPLICATION SLAVE ON TESTDATABASE.* TO "replication"@"192.168.1.9" IDENTIFIED BY "password";

И обнаружил следующую ошибку:

ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

Так как привилегии REPLICATION SLAVE являются глобальными и не могут быть назначены конкретной базе данных, то и в запросе их нужно указывать глобально, поэтому SQL запрос должен выглядеть так:

GRANT REPLICATION SLAVE ON *.* TO "replication"@"192.168.1.9" IDENTIFIED BY "password";

После этого запрос выполнился успешно:

Query OK, 0 rows affected, 1 warning (0,01 sec)