IT-Wissen/mysql/README.md
Roger Rutishauser b6160ff23b sql
2024-10-04 14:22:20 +02:00

7.2 KiB

Table of Contents

MySQL

Für Joins, siehe auch: Roger SQL Join Tutorial


System

Which MySQL is running?

Für 5.7.x versionen... Percona, Oracle...

SELECT SUBSTR(variable_value,1,
LOCATE(' ',variable_value) - 1) DBVersion
FROM information_schema.global_variables
WHERE variable_name='version_comment';

Show global variables

SHOW GLOBAL VARIABLES;
SHOW GLOBAL VARIABLES LIKE 'innodb%';
SHOW GLOBAL VARIABLES LIKE 'innodb_rollback_on_timeout';

Set global variables

Only until next MySQL restart. For permanent change, use my.cnf under the [mysqld] header.

SET GLOBAL innodb_lock_wait_timeout = 320;

Users, Grants

set root password

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
FLUSH PRIVILEGES;

siehe auch https://linuxhint.com/change-mysql-root-password-ubuntu/

Show users

SELECT host,user,authentication_string FROM mysql.user;

Add user

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

version 8.0

nCREATE USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Show grants for user

SHOW GRANTS FOR 'user_name'@'host';

Grant

also see: https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql#how-to-grant-different-user-permissions

GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';  # give full root privileges
GRANT ALL PRIVILEGES ON db1.* TO 'newuser'@'localhost';  # give privileges for database db1
FLUSH PRIVILEGES;

Revoke

REVOKE type_of_permission ON database_name.* FROM 'username'@'localhost';
FLUSH PRIVILEGES;

Change Password for user

ALTER USER 'user-name'@'localhost' IDENTIFIED BY 'NEW_USER_PASSWORD';
FLUSH PRIVILEGES;

# or

UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass')
WHERE User = 'username' AND Host = 'localhost';
FLUSH PRIVILEGES;

Database

Drop DB

DROP DATABASE IF EXISTS database_name;

Export DB

mysqldump -h mariadb-p01.infra.vs.ch -P 33003 -uingest -p --routines --lock-tables=false --single-transaction atom > ~/atomp-01-20210425.sql

Windows

mysqldump -h mariadb-p01.infra.vs.ch -P 33003 -uingest -p --routines --lock-tables=false --single-transaction atom --result-file="c:\atomp-01-20210425.sql"

Falls Fehler mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT..... diese Option noch mit einbeziehen --column-statistics=0

See also https://www.linode.com/docs/guides/use-mysqldump-to-back-up-mysql-or-mariadb/

Import DB

mysql -uusername -p db_name < /path/to/file.sql

Falls komprimierter dump:

gunzip < file.sql.gz | mysql -uusername -p db_name

Create DB

mysql -h localhost -u root -p -e "CREATE DATABASE atom CHARACTER SET utf8 COLLATE utf8_unicode_ci;"

Get Database Properties

SELECT default_character_set_name, default_collation_name FROM information_schema.schemata WHERE schema_name = 'dar416';

Tables

Count rows in all tables

select sum(TABLE_ROWS) from information_schema.tables where table_schema = 'db-name';

Count rows in each table

SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db-name';

Export/dump single table

mysqldump db_name table_name > table_name.sql

Import single table

mysql -u username -p db_name < /path/to/table_name.sql

Drop Tables

DROP TABLE IF EXIST [table 1], [table 2], [table n];

Select over single table

SELECT mit GROUP BY und HAVING

SELECT post_title, COUNT(*) c
FROM wp_posts
WHERE post_type='article'
  AND post_author=1
GROUP BY post_title
HAVING c > 1

Select to file

mysql -uroot -e "use atom_A; select io.identifier, io.id, information_object_i18n.title from information_object io left join information_object_i18n on io.id = information_object_i18n.id where io.identifier IS NULL or io.identifier like '#%' or io.identifier = '?' order by identifier;" > /home/ubuntu/identifier_not_number.csv

List rows that have the same value in a column

SELECT ve.vrzng_enht_id, vebhltn.bhltn_id
FROM vws_vrzng_enht_grund_daten  ve,
     vws_vrzng_enht_bhltn        vebhltn
WHERE vebhltn.vrzng_enht_id   =  ve.vrzng_enht_id
AND vebhltn.bhltn_id IN(
  SELECT vebhltn.bhltn_id FROM vws_vrzng_enht_bhltn vebhltn
  GROUP BY vebhltn.bhltn_id HAVING COUNT(*) > 1
)

List duplicates (grouped), with additional col "found duplicates"

SELECT post_title, COUNT(post_title)
FROM wp_posts
WHERE post_type = 'article'
  AND post_status = 'publish'
  AND post_title NOT LIKE 'Der Chart des Tages'
GROUP BY post_title
HAVING COUNT(post_title) >= 2;

# or, if all fields should be visible:
SELECT *, count(post_title)
FROM wp_posts
WHERE post_type = 'article'
  AND post_status = 'publish'
  AND post_title NOT LIKE 'Der Chart des Tages'
GROUP BY post_title
HAVING count(post_title) >= 2

Select over multiple tables

SELECT with LEFT JOIN

SELECT fuw_master.*, fuw_master_variation.name
FROM fuw_master
  LEFT JOIN fuw_master_variation
  ON fuw_master.id = fuw_master_variation.id_master;

Create

Table with columns from 2 tables (using JOIN)

CREATE TABLE fuw_master_2
SELECT fuw_master.*, fuw_master_variation.name
FROM fuw_master
  LEFT JOIN fuw_master_variation
  ON fuw_master.id = fuw_master_variation.id_master;

Insert

INSERT INTO blabla (spaltenname1, spaltenname2) VALUES ('wert1', 123)

Update

UPDATE table_name SET field1 = new-value1, field2 = new-value2
[WHERE Clause]

With replace:

UPDATE table_name SET field_name = REPLACE(field_name,
        string_to_find,
        string_to_replace)
[WHERE Clause]

With joins:

UPDATE information_object_i18n AS io 
  LEFT JOIN property p1 
    ON p1.object_id = io.id 
  LEFT JOIN property_i18n p2 
    ON p1.id = p2.id 
  SET io.title = CONCAT('recovery_failed_', io.title) 
WHERE p1.name LIKE 'PID' 
AND p2.value = 'CH-000-0:1234';

Export from command line

mysql>SELECT * FROM tablexy 
INTO OUTFILE 'path/outfile.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"',
ESCAPED BY '',
LINES TERMINATED BY '\n'

path muss meistens dem Pfad entsprechen, der unter select @@secure_file_priv; gesetzt ist!


Version Upgrade 5.7 to 8.0

Install 5.7 on Ubuntu 20

Fehlermeldungen

Error "1038 Out of memory, consider increasing server sort buffer size

Disk voll wegen zu vielen binlogs

In /var/lib/mysql sind zu viele binlogs. Lösung: auf nur 1 Woche reduzieren. Binlogs werden für Restorte gebraucht.

  • mysql service stoppen
  • /etc/mysql/conf.d/mysql.cnf erweitern um: binlog_expire_logs_seconds=604800
  • mysql neu starten