👁️
pierreinside
  • Introduction
  • Workbench
    • VirtualBox
    • Linux
      • Linux-Paketverwaltung
      • Linux Initialisierung
      • Ubuntu 14.10 LTS
      • Ubuntu 16.04 LTS
      • Ubuntu 18.04 LTS
      • Ubuntu 20.04 LTS
      • Ubuntu - Netzwerk
    • Konsole
      • ssh
      • zsh
      • cygwin
      • Babun
      • terminator
      • Terminal Multiplexer
      • Linux Tools
    • awesome
    • Entwicklungsumgebungen
      • Texteditors
      • Visual Studio Code
      • IntelliJ - IDEA
  • Softwareentwicklungsprozess
    • Schätzungen
    • Eventstorming
    • OKR
  • Architektur
    • Uncle Bob
    • Microservices
    • NoSQL
      • ElasticSearch
    • Hystrix
    • Reactive Programming
    • AngularJS
    • Service Mesh
  • Networking
    • Dependency Injection
  • Programming
    • Java Core/EE
      • Java 8
      • Java Annotationen
      • Bean Validation
      • Enterprise Java Beans Specification
      • Dependency Injection
    • JRebel
    • Webservices
      • HTTP
      • REST
      • Spring MVC REST
      • Swagger
      • Postman
    • Spring Ecosystem
      • Spring Core
      • Spring Boot
        • Programming
        • Production Ready
        • Testing
      • Spring Cloud
      • Spring Cloud Config
      • Spring MVC
      • Spring Data
      • Spring Petclinic
    • NodeJS
    • UI-Technologie
      • Thymeleaf
      • ionic
      • Web Fonts
      • Jinja Templates
      • Twitter Bootstrap
    • Python Ecosystem
      • Python Libraries
      • Python Testing
      • Python Best-Practices
      • Python Snippets
      • Python Selenium
      • Kivy UI
      • FastAPI
      • Typer CLI
      • Django
    • Groovy
    • Persistenz
      • Transactions
        • Java TX
        • JPA TX
      • TX Handling
      • JPA
        • Eclipse Link
      • MySQL
        • MySQL Performance
        • Docker MySQL
      • Hazelcast
    • Glassfish
    • YAML
    • Angular
    • Camel
    • Zeichenkodierung
    • Kinder lernen Programmieren
  • Testen
    • Easymock
    • Mockito
  • Performance & Scalability
    • Java Performance
      • Heapdump Analysis
    • Java Concurrency
    • Instana
  • Sicherheit
    • Authentifizierung
      • OpenID Connect
      • Web-Authentication API
    • Authorisierung
      • OAuth
      • SAML
    • Spring Security
    • Zertifikate
    • Kali Linux
    • VPN
    • Zero-Trust-Networks
  • Build und Deployment
    • Maven
    • Bamboo
    • Jenkins
      • Jenkins Pipelines
      • Jenkins Pipelines Tips und Tricks
      • Jenkins-configuration-as-Code
      • Jenkins IDE
    • Travis CI
    • Shellprogrammierung
      • jq - JSON Parsing
    • Konfiguration Management
    • Vagrant
      • Vagrant-Ansible-Integration
      • Vagrant Box bauen
    • Ansible
      • Getting Started
      • Ansible Details
    • Saltstack
    • LinuxKit
    • Container
      • Docker
        • Docker Getting Started
        • Debugging Docker
        • Docker Build
        • Docker Registry
        • Docker run
          • docker run
          • docker network
        • Docker Compose
        • docker machine
        • Docker@Windows
        • Docker Host
        • Docker Scaling
        • Docker Ressources
        • Docker Logging
        • windowsContainer
      • Cloud Deployment Provider
        • AWS
          • Anwendungsdeployment
          • Workload
          • Permissions
          • Netzwerke
          • AWS CLI
            • aws-vault
          • RDS
          • Static Website Hosting
          • EKS - Elastic Kubernetes Service
          • S3
        • Google Cloud Platform
      • Docker Orchestrierung
        • CoreOS
        • Kubernetes
          • microK8s
          • minikube
          • autoscaler
          • Docker
          • k9s
        • Nomad
    • PHP
  • Operations
    • Proxy
      • NGINX
    • DNS
    • Logging
      • Graylog
      • Fluentd
    • Monitoring
      • Grafana
    • Infrastructure-as-Code
      • Terraform
        • AWS-Provider
        • GitHub-Provider
      • Packer
    • Deployment
      • Vault
      • Consul
        • Consul Template
      • Fabio
  • Rechtliches
    • Software-Lizenzen
  • Git Ecosystem
    • Git
      • Git Lifecycle Hooks
    • GitHub
      • GitHub Organizations
    • GitHub Actions
    • GitHub Pages
    • GitHub CLI
    • GitHub Copilot
    • GitHub-AWS OIDC
    • GitBook
    • GitLab
    • Bitbucket/Stash
  • Publishing
    • WordPress
    • Markdown
    • Static Site Generators
      • Hugo
      • Jekyll
    • Tiddly Wiki
    • Leanpub
    • Animationsfilme
  • Storage
    • Synology 2012
    • Synology 2021
  • Collaboration
    • Übersicht
    • Microsoft Teams
  • Konferenzen
    • Velocity Berlin 2019
  • IT mit Kindern
    • Projekt Sportstracker
    • Scratch
    • Pico Spielekonsole
  • Schule
    • Mathematik
  • Misc
    • Foto/Video
      • Foto/Video Sammlung bis 2023
        • Handbrake
        • Onedrive
      • Foto/Video Sammlung ab 2024
      • Gopro
      • Panasonic FZ1000 ii
        • als Webcam
      • AV Receiver
      • Videos erstellen
        • OBS Studio
        • Touch Portal
        • Game-Streaming
      • Kameratasche
      • Kamera 2020
    • Handy
      • 2016
      • 2018
      • 2019
      • 2021
      • 2022
    • Computer
      • Laptop
        • 2018
        • Chromebook
      • Monitor
        • 4k
      • Software
        • Command Line Interface
        • Google API
        • Plant UML
        • Chromium
        • Passwort-Manager
        • GPG
      • Dell CNF 2665 Farbdrucker
      • Dockingstation
      • Gaming PC 2021
      • Mobiles Büro
      • Mobiles Internet
      • Mobiler Router
    • Beamer Benq W1000+
    • Spielekonsole
      • 2017
        • Playstation 4
      • Pico Spielekonsole
    • Gadgets
      • iPad Pro 2015 und 2016
      • iPad Air 2024
      • Macbook Pro
      • Smartwatch
      • Slate
      • Mudi
    • Fahrrad
      • Jonas 2018
      • SQLab
    • Auto
      • Auto 2022
      • Camping
        • Camping Touren Ideen
          • Camping Tour - Gardasee 2021
        • Camper
          • Camper klein - keine Stehhöhe
            • VW Bus Erfahrungen
          • Camper gross - Stehhöhe
    • Haus
      • Klimaanlage
      • Swimming Pool
      • Quick Mill Orione 3000
      • Spülmaschine 2021
      • Hebe-Schiebetür
      • Gasgrill
      • Minibar / Mini-Kühlschrank
      • Glasfaseranschluss (Fiber-to-the-Home)
      • Smart-Home
        • Raspberry Pi
        • Heimnetzwerk
      • Homeoffice
      • Energie
        • Solar
        • Wärmepumpe
    • Freizeit
      • Musik Streaming
      • Sky
      • Online Lernplattformen
      • eScooter - ePowerFun
    • Fußball
      • Meine Arbeit als Fußball-Trainer
      • Fußball Tools
      • DFB Talentförderung
    • Google Impact Challenge
  • Englisch
Powered by GitBook
On this page
  • Distributionen
  • Installation
  • MySQL APT Repository
  • User einrichten
  • Konfiguration und Administration
  • User und Datenbanken anlegen
  • MySQL Workbench
  • Installation
  • Performance Analyse
  • dbeaver
  • Storage Engine
  • InnoDB
  • MyISAM
  • Information Schema
  • MySQL Enterprise Manager
  • MySQL Workbench
  • Optimierung
  • MySQL-Server im Docker Container
  • Backup und Restore
  • MySQL-Tooling im Docker Container
  • Zugriff über MySQL Client aus Docker Container
  • FAQ

Was this helpful?

  1. Programming
  2. Persistenz

MySQL


Distributionen

Es gibt u. a. folgende Distributionen

  • Community MySQL ... von Oracle

    • bildet die Grundlage für die anderen Distributionen

  • MariaDB

    • hat häufig ein paar dedizierte Performance-Optimierungen

    • erstellt vom MySQL Gründer

  • Percona Server

    • hat häufig ein paar dedizierte Performance-Optimierungen

    • SlowQuery Log ist viel informativer

  • WebScaleSQL

    • Fork von Facebook, Google, ...

Diese Distributionenn sind zueinander kompatibel, so daß man eine andere Distribution installieren kann, die auf den Dateien der anderen arbeitet.


Installation

Unter Linux gibt es zwei Paketquellen:

  • RECOMMENDED: offizielle MySQL Pakete ... die Installation läuft über das MySQL APT Repository (siehe unten)

  • Pakete des Distributionsanbieters

MySQL APT Repository

  • http://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/

  • http://dev.mysql.com/downloads/repo/apt/

Enthält:

  • verschiedene MySQL Server Versionen

  • MySQL Workbench

  • MySQL Utilities

  • MySQL Suite

  • MySQL Router

Schritt für Schritt:

  • download des MySQL APT Repository von hier: http://dev.mysql.com/downloads/repo/apt/

    • hierzu muss man NICHT sich bei Oracle registrieren ... einfach No thanks, just start my download auswählen, dann gehts auch ohne Registrierung

  • MySQL APT Repository installieren: sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb

    • ACHTUNG: damit wird das System (die Repo-Konfiguration des Linux-Systems) nur so konfiguriert, daß man die offiziellen MySQL Pakete installieren kann

  • sudo apt-get update, um die MySQL Repository Informationen upzudaten

  • danach kann man dann weitere Pakete wie z. B. den MySQL Server oder die MySQL Workbench per apt-get install mysql-workbench-community installieren

Nach meinemm Upgrade von Ubuntu 16.04 LTS auf 18.04 LTS war dann plötzlich meine MySQL Workbench weg. Nach sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb wollte ich es per sudo apt-get update && sudo apt-get install mysql-workbench-community installieren, doch das schlug hiermit fehl:

The following packages have unmet dependencies:
 mysql-workbench-community : Depends: libcurl3 (>= 7.16.2) but it is not going to be installed
                             Depends: libjasper1 but it is not installable
                             Depends: libnetcdf11 (>= 4.0.1) but it is not installable
                             Depends: libpng12-0 (>= 1.2.13-4) but it is not installable
                             Depends: libxerces-c3.1 but it is not installable

Zeit für mich auf das Tool meiner Kollegen _DBeaver umzusteigen. Diese elenden Dependencies ... Docker ist echt eine geniale Erfindung (auch wenn es mir in dem Fall in keiner Weise hilft).

User einrichten

Bei der Einrichtung eines Users gibt man den Usernamen und den Host an, mit dem man zugreifen möchte. Verwendet man

pfh@localhost

dann kann man sich nur vom Rechner anmelden, auf dem der Server läuft. Verwendet man stattdessen

pfh@*

dann kann man sich von jedem Rechner anmelden.

Das hat aber scheinbar nichts mir der Bindung des Kommunikationsports an das Netzwerkinterface zu tun. Ich finde das sehr strange.


Konfiguration und Administration

Erfolgt über /etc/mysql/my.cnf, die aber wiederum weitere *.cnf Dateien in /etc/mysql/conf.d/ berücksichtigt und miteinander abmischt ... die Dateien in /etc/mysql/conf.d/ überschreiben die Werte in /etc/mysql/my.cnf.

User und Datenbanken anlegen

  • MySQL Passwort-Generator

Ich bin ein großer Fan von CLI's, weil ich dann meine Befehle immer wieder über die Command-History wiederfinden kann und außerdem mit Kollegen austauschen kann. Das ist dann oftmals schon der erste Schritt zur Automatisierung von Aufgaben. Hierzu benötigt man das mysql-CLI-Tool. Am einfachsten man startet einen Docker-Container (z. B. docker run -it mysql:5.7 sh) - alternativ kann man natürlich einen MySQL-Client installieren.

Beachte, daß an einer Stelle Backticks benutzt werden müssen, wenn der Datenbankname Bindestriche enthält!!!

mysql -u root -h db.cachaca.de -p
... interaktive Passwortabfrage ...
create database `pierre-database`
GRANT ALL PRIVILEGES ON `pierre-database`.* TO 'pierre'@'%' IDENTIFIED BY PASSWORD '*A4B6157319038724E3560894F7F932C8886EBFCF;';

Anschließend sollten die Grants show grants 'pierre'; so aussehen:

+-------------------------------------------------------------------------------------------------------+
| Grants for pierre@%                                                                                   |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'pierre'@'%' IDENTIFIED BY PASSWORD '*A4B6157319038724E3560894F7F932C8886EBFCF' |
| GRANT ALL PRIVILEGES ON `pierre`.* TO 'pierre'@'%'                                                  |
+-------------------------------------------------------------------------------------------------------+

und ich sollte mich mit dem User pierre/1234 (Passwort ist 1234) anmelden können und per

use pierre;
create table haus (id VARCHAR(32)) DEFAULT CHARSET=utf8;

die Tabelle pierre.haus anlegen können.

In dem Beispiel führe ich das Anlegen der Datenbank in dem mysql Terminal aus - das ist also von der Bash-History nicht abgedeckt. In diesem Fall ist das beabsichtigt, da hier auch Passwörter erforderlich sind, die ich NICHT in der History haben möchte.

Nach diesen Schritten kann sich der User my-user an der Datenbank pierre-database des Datenbankservers db.cachaca.de von allen Rechnern aus anmelden (für das hashed Passwort habe ich MySQL Passwort-Generator verwendet) und hat dabei alle Berchtigungen (ALL PRIVILEGES = SELECT + INSERT + ... siehe Dokumentation).

Ich hatte mal Probleme mit der REVOKE Syntax ... das shwo grants for pierre Kommando hat mir dann geholfen, den richtigen Befehl mit den richtigen Hochkomma und Backticks zu finden. Einfach in

GRANT ALL PRIVILEGES ON `pierre`.* TO 'pierre'@'%'

das GRANT durch REVOKE und TOdurch FROM austauschen:

REVOKE ALL PRIVILEGES ON `pierre`.* FROM 'pierre'@'%'

Voila ;-)


MySQL Workbench

  • https://www.youtube.com/watch?v=X_umYKqKaF0

MySQL stellt mit der Workbench auch Tooling für Developer bereit, um

  • die Datenbank zu administrieren

  • Datenbankabfragen auszuführen

  • Performanceanalysen durchzuführen

Installation

  • http://dev.mysql.com/doc/workbench/en/wb-installing-linux.html

Man sollte nach Möglichkeit die Pakete von MySQL selbst verwenden (aka mysql-workbench-community) anstatt die - teilweise veralteten - Pakete des Distributionsanbieters (aka mysql-workbench).

DESHALB:

  • das MySQL APT Repository installieren, um die offiziellen Pakete zu bekommen (siehe oben)

  • sudo apt-get install mysql-workbench-community

  • MySQL Workbench starten: mysql-workbench

Performance Analyse

siehe eigene Seite


dbeaver

Nach einem Upgrade meiner Linux-Distribution hat die MySQL-Workbench nicht mehr funktioniert und ich habe dem dbeaver eine Chance gegeben, da meine Kollegen begeistert sind.

... ich mag ihn auch


Storage Engine

MySQL bietet mehrere Storage Engines an, die teilweise hoistorisch gewachsen sind - teilweise aber auch unterschiedliche Einsatzbereiche haben:

  • InnoDB: transaktional

  • MyISAM: nicht transaktional

InnoDB

  • jede Tabelle landet in einer eigenen Datei, die einen Tablespace repräsentiert (zumindest bei der Einstellung innodb_file_per_table=1) - ein Aufteilen auf verschiedene Festplatten (schnell/langsam) mit jeweils eigenen Festplattencontrollern (Zugriffsparallelisiserung) ist dadurch möglich

  • Row-Locks

  • ACID Support

MyISAM

  • kennt nur Table-Locks keine Row-Locks ... schlechte Performance in Multi-Session-Szenarien


Information Schema

MySQL hält neben dem Performance Schema (siehe unten) auch das sog. Information Schema. In diesem findet man beispielsweise die Größe der Datenbank und die Anzahl der Zeilen.

ACHTUNG: es handelt sich hier nur um ungefähre Angaben ... insbes. bei der Zeilenanzahl wird man das schnell feststellen. Diese Daten verändern sich auch, wenn man ein ANALYZE TABLE durchführt (und das sollte man auch tatsächlich tun bevor man verlässliche Angaben haben will!!!).

SELECT
	TABLE_NAME, 
    table_rows, 
    round(((data_length) / 1024 / 1024),2) "Data Length in MB" , 
    round(((index_length) / 1024 / 1024),2) "Index Length in MB", 
	round(((data_length + index_length) / 1024 / 1024),2) "Size in MB"
FROM information_schema.TABLES 
WHERE table_schema = "mydatabase" and
	  round(((data_length + index_length) / 1024 / 1024),2) > 10

ACHTUNG:

  • man sollte vor der Nutzung des Information Schema ein Analyze Tables machen, ansonsten sind die Werte nicht aktuell

  • table_rows kann man nicht gebrauchen ... es handelt sich um einen hochgerechneten Wert (aus der data_length und einem durchschnittlichen Datensatz


MySQL Enterprise Manager

  • https://www.mysql.com/products/enterprise/monitor.html

  • Youtube Video: https://www.youtube.com/watch?v=e5HhC0XiioY

Da MySQL mittlerweile zu Oracle gehört, sieht der MySQL Enterprise Manager fast genauso aus wie der Oracle Enterprise Manager. Vom Oracle Enterprise Manager war ich sehr begeistert ... wir haben damit viele Bottlenecks entdeckt und konnte diese oft schon mit kleinen Änderungen (z. B. Index anlegen) beheben.

Mit diesem Tool sind gezielte Realtime-Analysen möglich, um die Hotspots auf der Datenbank zu finden (Explain-Plans, Index-Nutzung, IO auf Filesystem und Netzwerk).

... mittlerweile bin ich großer von von Instana - Realtime Live Database Analyse und noch mehr :-)

MySQL Workbench

  • https://www.mysql.de/products/workbench/performance/


Optimierung

  • http://dev.mysql.com/doc/refman/5.7/en/mysqlcheck.html

Die SQL-Engine benötigt Informationen über die Datenbelegung der Tabellen, um den besten Execution Plan berechnen zu können. Das liegt daran, daß je nach Belegung unterschiedliche Indexzugriffe optimal sind.

Bei Oracle verwendet man den sog. Gather Stats Job ... bei MySQL verwendet man mysqlcheck mit --analyze und --optimize Option:

mysqlcheck --analyze --databases mydatabase --user root -p

MySQL-Server im Docker Container

Vermutlich wird man die Datenbank-Dateien auf den Docker-Host legen wollen, um den MySQL-Container wegwerfen und neu deployen zu können, ohne die Daten zu verlieren.

Hier läuft man allerdings schnell in Permission-Probleme, weil die User-Ids auf dem Docker-Host nicht mit den User-Ids im Docker-Container übereinstimmen und man somit auf dem Docker-Host nur als root volle Rechte auf die Dateien hat (um beispielsweise die Datenbank-Dateien zu löschen).

Backup und Restore

  • http://depressiverobot.com/2015/02/19/mysql-dump-docker.html


MySQL-Tooling im Docker Container

Nicht jeder hat die MySQL Tools auf seinem Rechner installiert. Was liegt da näher als einen MySQL-Container zu starten und die Tools daraus zu nutzen.

Zugriff über MySQL Client aus Docker Container

Das Tool mysql ist ein CLI zum Zugrifdf auf MySQL Datenbanken:

pfh@workbench ~ % docker run mysql:5.7 \
   mysql \
      --protocol=TCP \
      --host="10.90.61.109" \
      --port=53306 \
      --user="root" \
      --password=root \
      --database=mydb \
      --execute="select * from information_schema.TABLES"

Das funktioniert grundsätzlich ganz prima. Läuft die Datenbank allerdings auf dem Docker-Host in einem Docker-Container, dann darf man nicht localhost oder 127.0.0.1 als host verwenden, sondern die IP-Adresse des Docker-Hosts. Ansonsten bekommt man einen kryptischen Fehler dieser Art:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

siehe auch http://dev.mysql.com/doc/refman/5.7/en/problems-connecting.html


FAQ

  • https://dev.mysql.com/doc/refman/5.6/en/problems-connecting.html

Frage 1: Ich habe einen MySQL Server im Docker-Container laufen - gestartet per docker run --name piedb -e MYSQL_ROOT_PASSWORD=Test1234 -d -P mysql:5.7. Der Server startet auch korrekt

2016-09-14T13:26:53.173357Z 0 [Note] mysqld: ready for connections.
Version: '5.7.15'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306
MySQL Community Server (GPL)

und der Port 3306 ist auch weitergeleitet:

0.0.0.0:32768->3306/tcp

aber wenn ich mich mit einem Datenbank-Client darauf connecten will (localhost:32768), dann bekomme ich die Fehlermeldung

Unable to connect to the database. 
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Antwort 1: Das liegt daran, daß die MySQL-Server im Container liegt und das Unix-Socket-File /var/run/mysqld/mysqld.sock auf dem Docker-Host gar nicht existiert. Es muß eine Network-Socket Kommunikation initiiert werden. Hierzu muß statt localhost:32768 ein 127.0.0.1:32768 verwendet werden. Alternativ kann man die Verbindungsart auch per --protocol=TCP explizit angeben (http://serverfault.com/questions/337818/how-to-force-mysql-to-connect-by-tcp-instead-of-a-unix-socket).

Siehe auch http://dev.mysql.com/doc/refman/5.7/en/problems-connecting.html

PreviousEclipse LinkNextMySQL Performance

Last updated 3 years ago

Was this helpful?