MySQL – Bitkorn Blog https://blog.bitkorn.de Developer Zeugz Mon, 02 Jan 2023 10:29:08 +0000 de-DE hourly 1 https://wordpress.org/?v=6.3.1 MySQL DEFINER hell https://blog.bitkorn.de/mysql-definer-hell/ Fri, 28 Jan 2022 07:18:52 +0000 https://blog.bitkorn.de/?p=1106 Leider schafft es mysqldump nicht die DEFINER weg zu lassen.
Dadurch kann man ein Problem mit dem DEFINER bekommen wenn man von einer anderen Maschine einen Dump einspielen will.
DEFINER:

  • DEFINER = `skip-grants user`@`skip-grants host`
  • DEFINER = root@localhost

Dazu kommen DEFINER mit dem Usernamen des Systems.

Außer, im generierten Dump per „suchen & ersetzen“ die DEFINER zu entfernen, gibt es wohl keine Lösung.

Lösung bei AWS funktioniert:

-- remove
sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql
sed -i -e 's/DEFINER=`skip-grants user`@`skip-grants host`//g' dump.sql
-- find & replace
sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql

mysqlpump

Dann gibt es seit 5.6 mysqlpump:

sudo mysqlpump dbname --skip-definer > /home/allapow/dump.sql
# Dump progress: 1/9 tables, 0/719 rows
# mysqlpump: [ERROR] (1449) The user specified as a definer ('skip-grants user'@'skip-grants host') does not exist
# Dump process encountered error and will not continue.
# Speicherzugriffsfehler
]]>
MySQL 8 deterministic function https://blog.bitkorn.de/mysql-8-deterministic-function/ Fri, 27 Aug 2021 09:01:20 +0000 https://blog.bitkorn.de/?p=1028 Nicht nur bei der Datenbank Wiederherstellung, auch bei Funktionen die nicht deterministisch sind.

Folgende Funktion ist nicht deterministisch:

CREATE FUNCTION func_count_something(p_someid INT) RETURNS INTEGER
BEGIN

    DECLARE some_count INTEGER;
    SELECT COUNT(*)
    INTO artikel_count
    FROM some_table
    WHERE someid = p_someid;
    RETURN some_count;
END;

Fehlermeldung bei der Erstellung:

[HY000][1418] This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

Gleiche Funktion – deterministisch:

CREATE FUNCTION func_count_something(p_someid INT) RETURNS INTEGER
-- this two lines do the trick
    DETERMINISTIC
    READS SQL DATA
BEGIN

    DECLARE some_count INTEGER;
    SELECT COUNT(*)
    INTO artikel_count
    FROM some_table
    WHERE someid = p_someid;
    RETURN some_count;
END;

dev.mysql.com – 25.7 Stored Program Binary Logging

Helfen würde auch ein:

SET GLOBAL log_bin_trust_function_creators = 1;

zur Erstellungszeit einer FUNCTION.

]]>
MySQL Zeugz https://blog.bitkorn.de/mysql-zeugz/ Thu, 26 Aug 2021 07:34:37 +0000 https://blog.bitkorn.de/?p=1019 GROUP mit CONCAT, DISDINCT und IF NULL:

SELECT GROUP_CONCAT(DISTINCT IF(TRIM(fieldname)='', NULL,TRIM(fieldname)) ORDER BY fieldname DESC SEPARATOR '|')

Ärger mit der MySQL Installation

Fehlermeldung könnte sein:

  1. This installation of MySQL is already upgraded to 5.7.36, use --force if you still need to run mysql_upgrade
# mache ich:
sudo dpkg --configure -a
# ...kommt Fehler (1) und bleibt hängen
# hilft bei (1) nur scheinbar
sudo dpkg-reconfigure mysql-server-5.7

mehrere Leerzeichen mit einem ersetzen …seit MySQL 8

UPDATE table_name SET column_name = REGEXP_REPLACE(column_name, '[ ]+', ' ');
]]>
MySQL 8 restore DB dump https://blog.bitkorn.de/mysql-8-restore-db-dump/ Tue, 18 Feb 2020 08:34:02 +0000 http://blog.bitkorn.de/?p=718 Seit MySQL 8, bei mir in Xubuntu 19.10, gibt es eine Fehlermeldung beim Importieren von Datenbanken:

mysql -u root -p db_name < /path/to/db_dump.sql
Enter password: 
ERROR 1418 (HY000) at line 571: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

…der Datenbank Import war unvollständig.

Beheben kann man das mit folgendem befehl in der MySQL Konsole:

SET GLOBAL log_bin_trust_function_creators = 1;

…oder diesen Wert in der my.cnf anpassen.

]]>
MySQL 5.7 ONLY_FULL_GROUP_BY https://blog.bitkorn.de/mysql-5-7-only_full_group_by/ Fri, 08 Jun 2018 09:54:14 +0000 http://blog.t-brieskorn.de/?p=427 phpMyAdmin ONLY_FULL_GROUP_BY

Abfrage für PhpMyAdmin:

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me

Kompletter Code für eine Datei /etc/mysql/conf.d/myfile.cnf

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Anschließend:

sudo systemctl restart mysql.service

In einer MySQL Shell kontrollieren:

select @@sql_mode

Dank an Stackoverflow.

im PHP Skript

mysqli_query($connection, "SET SESSION sql_mode=''");

Auch Dank an Stackoverflow

]]>
table column info https://blog.bitkorn.de/table-column-info/ Mon, 21 May 2018 09:56:36 +0000 http://blog.t-brieskorn.de/?p=419 auto increment Wert (nächst größeren :)):

SELECT (AUTO_INCREMENT + 1) AS next_auf_id
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'datenbankname'
AND   TABLE_NAME   = 'tabellenname'

Alle Infos zu einer Tabelle:

SHOW TABLE STATUS FROM `datenbankname` WHERE `name` LIKE 'tabellenname'
]]>
MySQL 8 root Passwort https://blog.bitkorn.de/mysql-8-root-passwort-ubuntu/ Sat, 05 May 2018 10:27:29 +0000 http://blog.t-brieskorn.de/?p=412 MySQL mit skip-grant-tables starten

In der /etc/my.cnf folgendes rein packen:

[mysqld]
skip-grant-tables
# wegen dem Fehler: ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded
# auch unter [mysqld] 
plugin-load-add = auth_socket.so

Anschließend MySQL restarten.

Ohne Passwort rein und root Passwort setzen

mysql -u root
FLUSH PRIVILEGES;
USE mysql;

-- MySQL 5.7
UPDATE user SET authentication_string=PASSWORD("mysecret") WHERE User='root';
UPDATE user SET plugin="mysql_native_password" WHERE User='root';

-- MySQL 8:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysecret';
-- UPDATE user SET plugin="caching_sha2_password" WHERE User='root';

quit

dev.mysql.com/doc/resetting-permissions
dev.mysql.com/doc/privilege-changes (FLUSH PRIVILEGES)

MySQL neu starten und Passwort testen

ZUERST: Das in der /etc/my.cnf auskommentieren!

sudo systemctl restart mysql

# und testen ob ich als root mit Passwort rein komme:
mysql -u root -p

mysql_secure_installation

sudo mysql_secure_installation
# darin:
# Change the root password? [Y/n] y

# und MySQL restarten
sudo systemctl restart mysql.service

# dann kann man als 'root' rein
# ACHTUNG! nur mit sudo, sonst: "Access denied for user 'root'@'localhost'"
sudo mysql -u root -p

dev.mysql.com/doc/mysql-secure-installation

Seit MySQL 8 kann man nicht mit dem User ‚root‘ arbeiten. Darum muss ein neuer User erstellt werden:

CREATE USER 'rumpelstil'@'localhost' IDENTIFIED BY 'mysecret';
GRANT ALL PRIVILEGES ON *.* TO 'rumpelstil'@'localhost';
FLUSH PRIVILEGES;
]]>
MySQL remote https://blog.bitkorn.de/mysql-remote/ Tue, 27 Mar 2018 09:10:49 +0000 http://blog.t-brieskorn.de/?p=392 sudo gedit /etc/mysql/my.cnf

…darin:

# auf allen IPs lauschen
# dann muss bei den Zugangsdaten (im Client) 127.0.0.1 stehen - statt localhost
bind-address		= 0.0.0.0
# oder nur auf einer bestimmten
bind-address		= 192.168.1.42
# in die MySQL Konsole
# sudo, weil seit MySQL 8.0 der User root geschützt ist
sudo mysql -u root -p

…darin einem User die notwendigen rechte (oder alle) geben:

GRANT ALL ON *.* TO root@'*' IDENTIFIED BY 'mypasswd';
quit
sudo service mysql restart

bzw.

sudo systemctl restart mysql.service

Hört MySQL zu?

sudo netstat -anp | grep :3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      9904/mysqld

OK, dann von dem Wirts-System:

mysql -u root -p -h 192.168.146.130
Enter password: 
]]>
phpMyAdmin database export file name template https://blog.bitkorn.de/phpmyadmin-database-export-file-name-template/ Mon, 06 Nov 2017 08:39:15 +0000 http://blog.t-brieskorn.de/?p=313 Meist möchte man den Dateinamen, der exportierten Datenbank, mit der aktuellen Zeit und wahrscheinlich mit dem Datenbanknamen bestücken.
Default ist nur der Datenbankname mittels @DATABASE@ (auch zu ersetzen mit __DB__).
Zusätzlich zu @DATABASE@ gibt es noch @TABLE@ und @SERVER@.

Man kann alles verwenden was die PHP Funktion strftime() verwendet, plus beliebige andere Zeichen.

Für ein Testsystem benutze ich beispielsweise: __DB__%Y%m%d%H%M_test

]]>
Access denied for user ‚root’@’localhost‘ https://blog.bitkorn.de/access-denied-for-user-rootlocalhost/ Sun, 02 Jul 2017 05:38:40 +0000 http://blog.t-brieskorn.de/?p=275 in der /etc/mysql/my.cnf unter [mysqld]

skip-grant-tables

hinzu fügen. Jetzt funzts.

Mache ich alles von stackoverflow funzts nich.

]]>