Skip to content

MySQL

Config

apt -y install mysql-server mysql-client
mysql -V
systemctl status mysql
mysqladmin -u root password задать пароль root

nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
user            = mysql
# pid-file      = /var/run/mysqld/mysqld.pid
# socket        = /var/run/mysqld/mysqld.sock
# port          = 3306
# datadir       = /var/lib/mysql
# tmpdir                = /tmp
bind-address            = 0.0.0.0
mysqlx-bind-address     = 0.0.0.0
log_error = /var/log/mysql/error.log

systemctl restart mysql
ss -tulnp | grep 3306
ufw allow 3306/tcp
nc -zv 192.168.1.253 3306
tnc 192.168.1.253 -p 3306

mysql -u root -p
SELECT user(), now(), version();
quit;

mysql -u root -p -e 'SHOW TABLES FROM db_aduser;' отобразить список таблиц без подключения к консоли MySQL

Commands

CREATE создать БД, пользователя, таблицу
ALTER управление столбцами таблице
DROP удалить БД, пользователя, таблицу
USE выбрать БД
SHOW вывесли список БД, прав доступа пользователя (GRANTS), названия столбцов и их свойства
GRANT дать доступ пользователю к БД
REVOKE удалить доступ пользователя к БД
UPDATE изменить права доступа, значения с таблице
FLUSH обновить права доступа
SELECT отобразить выбранную БД, вывести список пользователей, выборка данных в таблице
INSERT внести данные
DELETE удалить данные в (FROM) таблице

DATA TYPE

VARCHAR(N) строка переменной длины, в формате ASCII, где один символ занимает 1 байт, числом N указывается максимальная возможная длина строки
NVARCHAR(N) строка переменной длины, в формате Unicode, где один символ занимает 2 байта
CHAR(N)/nchar(N) строка фиксированной длины, которая всегда дополняется справа пробелами до длины N и в базе данных она занимает ровно N символов
INT целое число, от -2147483648 до 2147483647, занимает 4 байта
FLOAT число, в котором может присутствовать десятичная точка (запятая)
BIT флаг, Да - 1 или Нет - 0
DATE формат даты, например 25.05.2023
TIME 23:30:55.1234567
DATETIME 25.05.2023 23:30:55.1234567

DATABASE

SHOW databases;                                                                     # вывести список БД
CREATE DATABASE db_aduser;                                                          # создать БД
CREATE DATABASE db_rep DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  # создать БД с кодировкой UTF-8
DROP DATABASE db_rep;                                                               # удалить БД
USE db_aduser;                                                                      # выбрать/переключиться на выбранную БД
SELECT database();                                                                  # отобразить выбранную БД

USER

SELECT USER,HOST FROM mysql.user;                                     # вывести список УЗ
CREATE USER posh@localhost IDENTIFIED BY '1qaz!QAZ';                  # создать УЗ, которая будет подключаться с локального сервера
CREATE USER posh@localhost IDENTIFIED BY '1qaz!QAZ';                  # создать УЗ, которая будет подключаться с указанного сервера
CREATE USER posh@'192.168.3.99' IDENTIFIED BY '1qaz!QAZ';             # УЗ для доступа с конкретного сервера
CREATE USER 'admin'@'%' IDENTIFIED BY 'Admin12#';                     # УЗ для доступа с любого сервера (% - wildcard)
DROP USER posh@localhost;                                             # удалить пользователя
SHOW GRANTS FOR posh@'%';                                             # отобразить права доступа пользователя
GRANT ALL PRIVILEGES ON db_aduser.* TO posh@'192.168.3.99';           # полный доступ для posh к БД db_aduser
GRANT ALL PRIVILEGES ON *.* TO posh@'%';                              # доступ к всем БД c любого клиентского хоста
GRANT SELECT,DELETE ON mysql.* TO posh@'%';                           # права SELECT и DELETE на встроенную БД mysql
REVOKE DELETE ON mysql.* FROM posh@'%';                               # удалить доступ DELETE
UPDATE mysql.user SET super_priv='Y' WHERE USER='posh' AND host='%';  # изменить привелегии для пользователя
SELECT USER,HOST,super_priv FROM mysql.user;                          # список УЗ и таблица с правами SUPER privilege
FLUSH PRIVILEGES;                                                     # обновить права доступа

TABLE

SHOW TABLES;               # отобразить список всех таблиц
SHOW TABLES LIKE '%user';  # поиск таблицы по wildcard-имени
CREATE TABLE table_aduser (id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(100), email VARCHAR(100), PRIMARY KEY (ID));  # создать таблицу
DROP TABLE table_aduser;   # удалить таблицу

COLUMN

SHOW COLUMNS FROM table_aduser;                                                         # отобразить название стобцов и их свойства
ALTER TABLE table_aduser DROP COLUMN id;                                                # удалить столбец id
ALTER TABLE table_aduser ADD COLUMN info VARCHAR(10);                                   # добавить столбец info
ALTER TABLE table_aduser CHANGE info new_info VARCHAR(100);                             # изменить имя столбца info на new_info и его тип данных
ALTER TABLE table_aduser ADD COLUMN (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID)); # добавить столбец id

INSERT

INSERT table_aduser (Name,email) VALUES ('Alex','no-email');
INSERT table_aduser (Name,email) VALUES ('Alex','no-email');
INSERT table_aduser (Name) VALUES ('Support');
INSERT table_aduser (Name) VALUES ('Jack');

SELECT

SELECT * FROM table_aduser;                     # содержимое всех стобцов в выбранной (FROM) таблице
SELECT Name,email FROM table_aduser;            # содержимое указанных стобцов
SELECT DISTINCT Name,Email FROM table_aduser;   # отобразить уникальные записи (без повторений)
SELECT * FROM table_aduser ORDER BY Name;       # отсортировать по Name
SELECT * FROM table_aduser ORDER BY Name DESC;  # обратная сортировка
SELECT COUNT(*) FROM table_aduser;              # количество строк в таблице
SELECT COUNT(new_info) FROM table_aduser;       # количество строк в столбце

WHERE

NOT; AND; OR                                                  # по приоритетам условий
SELECT * FROM table_aduser WHERE Name = 'Alex';               # поиск по содержимому
SELECT * FROM table_aduser WHERE NOT Name != 'Alex';          # условие NOT где Name не равен значению
SELECT * FROM table_aduser WHERE email != '';                 # вывести строки, где содержимое email не рано null
SELECT * FROM table_aduser WHERE email != '' OR id > 1000;    # или id выше 1000
SELECT * FROM table_aduser WHERE Name RLIKE "support";        # регистронезависемый (RLIKE) поиск
SELECT * FROM table_aduser WHERE Name RLIKE "^support";       # начинаются только с этого словосочетания

DELETE

SELECT * FROM table_aduser WHERE Name RLIKE "alex";   # найти и проверить значения перед удалением
DELETE FROM table_aduser WHERE Name RLIKE "alex";     # Query OK, 2 rows affected # удалено две строки
DELETE FROM table_aduser;                             # удалить ВСЕ значения

UPDATE

SELECT * FROM table_aduser WHERE Name = 'Jack';             # найти и проверить значение перед изменением
UPDATE table_aduser SET Name = 'Alex' WHERE Name = 'Jack';  # изменить значение 'Jack' на 'Alex'
UPDATE db_aduser.table_aduser SET Name='BCA' WHERE id=1;    # изменить значение в строке с ID 1

CHECK

CHECK TABLE db_aduser.table_aduser;     # проверить
ANALYZE TABLE db_aduser.table_aduser;   # анализировать
OPTIMIZE TABLE db_aduser.table_aduser;  # оптимизировать
REPAIR TABLE db_aduser.table_aduser;    # восстановить
TRUNCATE TABLE db_aduser.table_aduser;  # очистить

DUMP

mysqldump -u root -p --databases db_aduser > /bak/db_aduser.sql
mysql -u root -p db_aduser < /bak/db_aduser.sql

crontab -e
00 22 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix | /bin/bzip2 > `date +/dump/zabbix/zabbix-\%d-\%m-\%Y-\%H:\%M.bz2`
00 23 * * * /usr/bin/mysqldump -uroot -p1qaz!QAZ db_zabbix > `date +/dump/smb/zabbix-\%d-\%m-\%Y-\%H:\%M.sql`
0 0 * * * find /dump/zabbix -mtime +7 -exec rm {} \;

mysqldump -u root --single-transaction db_zabbix > /dump/zabbix/db_zabbix.sql
mysql -u user_zabbix -p -e 'CREATE DATABASE db_zabbix;'
mysql -u user_zabbix -p db_zabbix < /root/db_zabbix.sql

innodb_force_recovery

sed -i '/innodb_force_recovery/d' /etc/mysql/my.cnf # удалить
mode=6; sed -i "/^\[mysqld\]/{N;s/$/\ninnodb_force_recovery=$mode/}" /etc/mysql/my.cnf # добавить mode 6
systemctl restart mysql

[mysqld]
innodb_force_recovery=1 # сервер пытается начать работу независимо от того, есть ли поврежденные данные InnoDB или нет
innodb_force_recovery=2 # удается восстановить работу за счет остановки потока команд, которые были частично выполнены или не выполнены (не запускает фоновые операции)
innodb_force_recovery=3 # отменяет откат после восстановления поврежденных файлов (не пытается откатить транзакции)
innodb_force_recovery=6 # запуск СУБД в режиме read only

MySQL Connector NET

Add-ADUser

$ip = "192.168.1.253"
$user = "posh"
$pass = "1qaz!QAZ"
$db = "db_aduser"
Add-Type –Path "$home\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{
ConnectionString="server=$ip;uid=$user;pwd=$pass;database=$db"
}
$Connection.Open()
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand
$Command.Connection = $Connection
$UserList = Get-ADUser -filter * -properties name,EmailAddress
foreach ($user in $UserList) {
$uname=$user.Name
$uemail=$user.EmailAddress
$Command.CommandText = "INSERT INTO table_aduser (Name,Email) VALUES ('$uname','$uemail')"
$Command.ExecuteNonQuery()
}
$Connection.Close()

Get-ADUser

$ip = "192.168.1.253"
$user = "posh"
$pass = "1qaz!QAZ"
$db = "db_aduser"
Add-Type –Path "$home\Documents\MySQL-Connector-NET\8.0.31-4.8\MySql.Data.dll"
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{
ConnectionString = "server=$ip;uid=$user;pwd=$pass;database=$db"
}
$Connection.Open()
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand
$Command.Connection = $Connection
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$Command.CommandText = "SELECT * FROM table_aduser"
$MYSQLDataAdapter.SelectCommand = $Command
$NumberOfDataSets = $MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
$Collections = New-Object System.Collections.Generic.List[System.Object]
foreach($DataSet in $MYSQLDataSet.tables[0]) {
$Collections.Add([PSCustomObject]@{
Name = $DataSet.name;
Mail = $DataSet.email
})
}
$Connection.Close()
$Collections