• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

MySQL Schreibt auf die HDD:

revealed

Guru
Hi!"

Ja ne is klar werdet ihr sagen :) Ich meine aber:
Im PHP MyAdmin gibt es ja 'Laufzeitinformationen'. Diese sind für mich seit kurzem anlass, dass ich mich ein bisschen mit der Funktionsweise von MySQL genauer beschäftigen möchte.

Ich habe im Internet bisschen recherchiert und einige dinge ausprobiert. In laufzeitinformationen wird immer mit roten Zahlen gewarnt, wenn man sich um irgendwas kümmern möchte...

So habe ich dort schon einige engpässe auf meinem PC beheben können.

Jetzt habe ich allerdings folgendes Problem, dass ich nicht los werde:
Created_tmp_disk_tables 3 Anzahl der (implizit) auf der Platte erzeugten temporären Tabellen bei der Ausführung von Statements. Wenn Created_tmp_disk_tables hoch ist, sollten Sie eventuell die Variable tmp_table_size herauf setzen, damit temporäre Tabellen im Speicher erzeugt werden statt auf der Festplatte.

Kann mir jemand helfen? Ich hab schon einige Configwerte ausprobiert, aber er schreibt immer die drei temporären Tables..

Ich hätte das gerne Festplattenschonender oder schneller. Habe 2 GB RAM;

Hier mal noch meine /etc/my.cnf:
Code:
# Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /var/lib/mysql) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.

# The following options will be passed to all MySQL clients
[client]
#password	= your_password
port		= 3306
socket		= /var/lib/mysql/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port		= 3306
socket		= /var/lib/mysql/mysql.sock
skip-locking
key_buffer_size = 1536M
hot_cache.key_buffer_size = 1G
cold_cache.key_buffer_size = 1G
max_allowed_packet=16M
table_cache=1024
sort_buffer_size=512k
net_buffer_length=16M
read_buffer_size=256k
read_rnd_buffer_size=8M
myisam_sort_buffer_size = 8M

# from mysqltuner.pl and tuning-primer.sh
skip-innodb
#query_cache_limit=64M
query_cache_size=8M
tmp_table_size=32M
max_heap_table_size=32M
thread_cache_size=4
open_files_limit=2048
long_query_time=4

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication
# log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id	= 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin=mysql-bin

# Point the following paths to different dedicated disks
#tmpdir		= /tmp/		
#log-update 	= /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql/
#innodb_log_arch_dir = /var/lib/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50

# The safe_mysqld script
#Don't allow connections via TCP/IP.
#skip-networking

#Don't allow connections via TCP/IP.
skip-networking

#Client error messages in given language. May be given as a full path.
language=/usr/share/mysql/german/

#Don't allow new user creation by the user who has no write privileges to the mysql.user table.
safe-user-create

#Flush tables to disk between SQL commands.
#flush
[safe_mysqld]
err-log=/var/lib/mysql/mysqld.log

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
safe-updates

[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
Vielen Dank für Hilfe!

Gruß,

R
 

panamajo

Guru
Code:
# The MySQL server
[mysqld]
...
key_buffer_size = 1536M
hot_cache.key_buffer_size = 1G
cold_cache.key_buffer_size = 1G
max_allowed_packet=16M
Die Werte für *key_buffer_size sind Mondwerte, sinnvoll wäre ein Startwert von 32MiB und dann beobachten ob dies auch belegt wird.
Code:
query_cache_size=8M
Kann größer gewählt werden.
Code:
tmp_table_size=32M
max_heap_table_size=32M
Die beiden Werte beschränken die Größe von Tabellen im Speicher. Alles was größer als dieser Wert ist wird auf Platte angelegt.
 
OP
revealed

revealed

Guru
Hallo! :)

Vielen Dank für die Hilfe!
Kann größer gewählt werden.
... habe ich verdoppelt, das werde ich erstmal beobachten.

Die Werte für *key_buffer_size sind Mondwerte, ....
... auch das habe ich so eingestellt und werde beobachten:

Hier nochmal die Configänderungen:
Code:
# The MySQL server
[mysqld]
port		= 3306
socket		= /var/lib/mysql/mysql.sock
skip-locking
key_buffer_size = 32M
hot_cache.key_buffer_size = 1G
cold_cache.key_buffer_size = 1G
max_allowed_packet=16M
table_cache=1024
sort_buffer_size=512k
net_buffer_length=16M
read_buffer_size=256k
read_rnd_buffer_size=8M
myisam_sort_buffer_size = 8M

# from mysqltuner.pl
skip-innodb
#query_cache_limit=64M
query_cache_size=8M
tmp_table_size=64M
max_heap_table_size=64M
thread_cache_size=4
open_files_limit=2048
long_query_time=4
Ich würde mich dann wie gesagt nochmal melden mit Ergebnissen....

Gruß,

R
 
OP
revealed

revealed

Guru
Ok... Aufgebohrt auf 256 M; Und die Rote Zahl ist weg!
Edit: --> Lieber doch 1536M; Nach der Erfassung meiner Musiksammlung... /Edit

Also nachdem Amarok fertig ist:
Created_tmp_disk_tables 20 <- Demnach muss er ca. weniger als halb so viel auf die HDD schreiben?

Key_reads 11 k <- Das ist mir neu.
Key_read_requests 784 k

Select_full_join 6,400

Opened_tables 83

Und noch zwei:
Handler_read_rnd 294 Anzahl der Anfragen, eine Zeile basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Anfragen ausführen, die erfordern, dass das Ergebnis sortiert wird. Wenn Handler_read_rnd hoch ist, haben Sie wahrscheinlich viele Anfragen, die MySQL zwingen, ganze Tabellen zu scannen, oder Sie haben Joins, die Schlüssel nicht richtig benutzen.
Handler_read_rnd_next 22 M Anzahl der Anfragen, die nächste Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Tabellen-Scans durchführen. Im Allgemeinen weist das darauf hin, dass Ihre Tabellen nicht korrekt indiziert sind, oder dass Ihre Anfragen nicht so geschrieben sind, dass Sie Vorteile aus den Indexen ziehen, die Sie haben.

Vielen Dank nochmals!

Gruß,

R
 

panamajo

Guru
revealed schrieb:
Ok... Aufgebohrt auf 256 M; Und die Rote Zahl ist weg!
Edit: --> Lieber doch 1536M; Nach der Erfassung meiner Musiksammlung... /Edit
Bei 2GB RAM? Denk mal noch ob das Sinn ergibt ... bzw. frag MySQL nach dem Stand der Dinge,
Code:
mysql> SHOW STATUS LIKE 'key_blocks%'\G
Das Amarok DB Design ist durchaus verbesserungswürdig, bei entsprechend großer Sammlung wirst du immer langsame Querys gemeldet bekommen. Das verpackt MySQL aber immer noch um Längen beser als SQLite...
Die Ausgabe von phpMyAdmin ist wirklich nur ein grober Indikator für Optimierung, man sollte nicht bei jeder roter Zahl in Panik geraten.
Gerade bei Systemen im produktivem Einsatz ist es wichtig die Einstellungen nicht absurd groß zu wählen.
 
OP
revealed

revealed

Guru
Guten Morgen!

Code:
mysql> SHOW STATUS LIKE 'key_blocks%' \G
*************************** 1. row ***************************
Variable_name: Key_blocks_not_flushed
        Value: 0
*************************** 2. row ***************************
Variable_name: Key_blocks_unused
        Value: 28995
*************************** 3. row ***************************
Variable_name: Key_blocks_used
        Value: 0
3 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Created_tmp_disk%' \G
*************************** 1. row ***************************
Variable_name: Created_tmp_disk_tables
        Value: 0
1 row in set (0.00 sec)

mysql>
Kannst waren 256M Sinnvoll? Ich kann das aus Mangel an Erfahrung nicht wirklich beurteilen. Also Einsatzziel währe homeuse.
Scheinbar zieht der ein oder andere Wert den wiederum dritten auch mit sich? Also die Unsinnigkeit meiner Einstellung kann ich mir schon gut vorstellen.

Gruß,

R
 
Oben