En abril de 2009, Oracle compró el proyecto MySQL. Como resultado, se creó una bifurcación comunitaria MySQL llamada MariaDB. La razón principal para crear la bifurcación fue mantener el proyecto libre bajo la Licencia Pública General. WordPress, Joomla, Magento y demás utilizan siempre una Base De Datos para guardar el contenido. El paso de MySQL a MariaDB es relativamente fácil y tiene la ventaja adicional de que MariaDB es compatible con todos los scripts PHP, al menos con WordPress, XenForo, phpBB, MyBB, SMF, Drupal, Vbulletin.
Consulta SQL para Ver Variables por defecto y las actuales:
select information_schema.system_variables.variable_name,
information_schema.system_variables.default_value,
global_variables.variable_value from
information_schema.system_variables,information_schema.global_variables where
system_variables.variable_name=global_variables.variable_name and
system_variables.default_value <> global_variables.variable_value and
system_variables.default_value <> 0
MyISAM vs InnoDB
InnoDB vs MyISAM
Aquí están la mayores diferencias entre InnoDB y MyISAM:
- InnoDB tiene bloqueo a nivel de renglón (row-level locking). MyISAM sólo tiene bloqueo a nivel de tabla completo.
- InnoDB tiene la que llaman integridad referencial que se trata de soportar claves externas (RDBMS) y restricciones, MyISAM no lo hace (DMBS).
- InnoDB soporta transacciones, lo que significa que se puede guardar y deshacer. Con MyISAM no se puede.
- InnoDB es más confiable al hacer registros transaccionales. MyISAM no lo es.
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database' and ENGINE = 'myISAM'
Convertir MyISAM en InnoDB con phpMyAdmin
Se puede convertir MyISAM en InnoDB bastante fácilmente. En este ejemplo abajo se usan la tabla wp_comments. Simplemente ejecute el comando ALTER para convertirlo en motor de almacenamiento InnoDB. Nota: Antes de realizar cualquier tipo de operaciones en su base de datos MySQL, siempre recomendamos hacer un backup sobre ello.
ALTER TABLE wp_comments ENGINE=InnoDB;
Asegúrese que estás ejecutando MySQL 5.6.4 o una versión superior. En caso contrario puede tener varios problemas donde InnoDB ya no soporta full-text indexing.
Convertir todas las tablas MyISAM a InnoDB de una base de datos:
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mibasededatos';
SELECT ENGINE,ROUND(SUM(data_length) /1024/1024, 1) AS "Data MB",ROUND(SUM(index_length)/1024/1024, 1) AS "Index MB",ROUND(SUM(data_length + index_length)/1024/1024, 1) AS "Total MB",COUNT(*) "Num Tables"FROM INFORMATION_SCHEMA.TABLESWHERE table_schema not in ("information_schema", "PERFORMANCE_SCHEMA", "SYS_SCHEMA", "ndbinfo")GROUP BY ENGINE;
- "Engine" (motor)
- Data (Datos)
- Index (índices)
- Total MB
- Número Tablas
Tuning MySQL (Optimización y rendimiento de MariaDB)
Configurando los Límites (/etc/security/limits.conf)
# https://mariadb.com/kb/en/configuring-linux-for-mariadb/
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft core unlimited
mysql hard core unlimited
Herramientas para optimizar
Fichero configuración my.cnf
InnoDB un archivo por tabla
InnoDB es el motor predeterminado de mariaDB y después de configurar estos parámetros, todas las tablas tendrán su propio archivo .idb en el servidor. Ahora surge la pregunta, ¿cómo hará que MariaDB sea más eficiente? Como todas las operaciones realizadas en esta tabla usarán la E / S de ese único archivo .idb y si trunca esa tabla, puede reclamar ese espacio, ya que se eliminará el archivo de esa tabla. También puede almacenar tablas en diferentes dispositivos de almacenamiento, ya que los archivos .idb pueden estar presentes en otro servidor. Para habilitar este parámetro, debe configurar el siguiente parámetro en el archivo /etc/my.cnf
innodb_file_per_table = 1
Tamaño de búfer de InnoDB
La gestión de la memoria es fundamental en los servidores de bases de datos, ya que puede haber cientos y miles de transacciones ejecutándose por segundo. Puede habilitar el almacenamiento en caché y la indexación en el servidor MariaDB configurando el parámetro de tamaño del grupo de búfer de InnoDB. La cantidad de memoria que desea dedicar depende únicamente de la cantidad de RAM que tenga su servidor. Si su servidor está dedicado a la base de datos, puede establecer el parámetro en el 60 por ciento de su memoria, pero si otros servicios se ejecutan en el mismo servidor, debe considerar un valor diferente. El valor predeterminado del tamaño del grupo de búfer es 8 MB y puede cambiar este valor agregando la siguiente línea en su archivo my.cnf
Algo que también hay que saber es que siempre que nuestro innodb_buffer_pool_size sea menor de 1GB, nuestro innodb_buffer_pool_instances será 1, así como el valor por defecto de innodb_buffer_pool_size son 128MB
El valor aunque puede ser hasta un 80% de la memoria RAM total instalada, dependerá del tamaño de nuestras tablas en la base de datos. No tiene sentido asignar 10GB si nuestra tabla más grande ocupa 1GB o menos.
innodb_buffer_pool_size = 1G
El motor InnoDB tiene un grupo de búfer que se utiliza para almacenar datos e índices en la memoria. Por supuesto, esto ayudará a que sus consultas de MySQL / MariaDB se ejecuten significativamente más rápido. Elegir aquí el tamaño adecuado requiere algunas decisiones muy importantes y un buen conocimiento del consumo de memoria de su sistema.
Esto es lo que debe considerar:
- Cuánta memoria necesitas para otros procesos. Esto incluye los procesos de su sistema, tablas de páginas, búferes de socket.
- ¿Su servidor está dedicado para MySQL o ejecutará otros servicios que consumen mucha memoria?
En un servidor dedicado, probablemente querrá ceder alrededor del 60-70% de la memoria RAM a innodb_buffer_pool_size. Si planea ejecutar más servicios en el servidor, debe reconsiderar la cantidad de memoria que dedica a su innodb_buffer_pool_size.
Para calcularlo podemos usar la siguiente consulta:
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
(SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;
Esto nos dará el RIBPS (Recommended InnoDB Buffer Pool Size) basdo en todas las tablas InnoDB Data e Indexes (índicies) con un adicional del 60%.
Por ejemplo:
mysql> SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM
-> (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
-> FROM information_schema.tables WHERE engine='InnoDB') A;
+-------+
| RIBPS |
+-------+
| 8 |
+-------+
1 row in set (4.31 sec)
[mysqld]
innodb_buffer_pool_size=8G
¿Y qué hay de la regla del 80% de RAM?
A priori, esta regla nos indica que deberíamos asignar un 80% de nuestra memoria física a nuestro buffer pool, Quiere decir que si tenemos 1TB de RAM deberíamos asignar 250GB? Como habréis deducido no tiene ningún sentido. Esta regla es un punto de partida inicial pero servidores pequeños pero una vez se van dimensionando dependerá de muchos factores, tales como si el servidor de base de datos es dedicado o no.
Activar Log Consultas lentas
# log querys lentas
# enable the log of slow queries
slow_query_log = 1
# set the time in seconds
long_query_time = 1
# the name of your slow query log file and the path to it
slow_query_log_file = /var/log/mysqld-slow-querys.log
# whether to write queries that do not use indexes to the log file log_queries_not_using_indexes
Crear fichero y propietario correctos:
touch /var/log/mysqld-slow-querys.log
chown mysql:mysql /var/log/mysqld-slow-querys.log
Mucho cuidado con aumentar sin sentido los valores como:
sort_buffer_size no es específico de ningún motor de almacenamiento y se aplica de manera general para la optimización.
Lo primero que debe saber es que sort_buffer_size es un búfer por sesión. Es decir, esta memoria se asigna por conexión / hilo.
En segundo lugar, internamente en el uso del sistema operativo independientemente de MySQL, hay un umbral> 256K. Si el búfer se establece en un valor superior a 256 K, utiliza mmap () en lugar de malloc () para la asignación de memoria. En realidad, esto es algo de libc malloc y se puede ajustar, pero el valor predeterminado es 256k. Un búfer de más de 256 K provoca una ralentización de 37 veces. Esto se aplica a todos los búferes por sesión, no solo al búfer de clasificación.
Si ve muchos sort_merge_passes por segundo en la salida SHOW GLOBAL STATUS, puede considerar aumentar el valor sort_buffer_size para acelerar las operaciones ORDER BY o GROUP BY que no se pueden mejorar con la optimización de consultas o la indexación mejorada. El búfer completo se asigna incluso si no se necesita todo, por lo que establecerlo en un valor mayor al requerido globalmente ralentizará la mayoría de las consultas de ese tipo. Es mejor aumentarlo como configuración de sesión y solo para las sesiones que necesitan un tamaño mayor.
En conclusión, en Linux, existen umbrales de 256 KB y 2 MB en los que los valores más grandes pueden ralentizar significativamente la asignación de memoria, por lo que debe considerar permanecer por debajo de uno de esos valores. Experimente para encontrar el mejor valor para su carga de trabajo.
Seguridad básica - Permisos usuario por Base de Datos
Recuerda otorgar permisos a los usuarios por base de datos, es decir, que cada usuario sólo puede ver y manipular su DB, y no el resto.
- ALL – permite el acceso completo a una base de datos específica. Si no se especifica una base de datos, permite el acceso completo a la totalidad de MySQL.
- CREATE – permite que un usuario cree bases de datos y tablas.
- DELETE – permite que un usuario elimine filas de una tabla.
- DROP – permite que un usuario elimine bases de datos y tablas.
- EXECUTE – permite que un usuario ejecute rutinas almacenadas.
- GRANT OPTION – permite que un usuario conceda o elimine los privilegios de otro usuario.
- INSERT – permite que un usuario inserte filas de una tabla.
- SELECT – permite que un usuario seleccione datos de una base de datos.
- SHOW DATABASES – permite que un usuario vea una lista de todas las bases de datos.
- UPDATE – permite que un usuario actualice filas en una tabla.
Seguridad básica
- mariadb-secure-installation o mysql_secure_installation
sudo mysql_secure_installation
Opciones de Seguridad fichero my.cnf
#securityActualmente se recomienda dejar query_cache_size en 0 y query_cache_type en OFF
local-infile=0
# para poner mysql remoto comentar (mysql sólo en local)
skip-networking
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#no dns lookups
skip-name-resolve
Optimizar MyISAM
- key_buffer_size
Cómo calcular el tamaño de la caché de claves MyISAM (key_buffer_size)
- Calcular key_buffer_size de TODAS las longitudes de índice MyISAM
- Servidor dedicado: Calcule key_buffer_size a partir de la memoria física total (recomendado por MySQL)
- Servidor compartido: Calcule key_buffer_size de la memoria del sistema disponible
select count(INDEX_LENGTH) as Indexes,sum(INDEX_LENGTH) as Total_Index_Length,floor(@overhead * 100) as PCT,floor(sum(INDEX_LENGTH)*@overhead) as Overhead,floor(sum(INDEX_LENGTH)*(1+@overhead)) as key_buffer_sizeFROM information_schema.TABLES WHERE ENGINE = 'MyISAM';"
SELECT CONCAT(ROUND(KBS/POWER(1024, IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999), SUBSTR(' KMG',IF(PowerOf1024<0,0, IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_key_buffer_size FROM (SELECT LEAST(POWER(2,32),KBS1) KBS FROM (SELECT SUM(index_length) KBS1 FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) AA ) A, (SELECT 3 PowerOf1024) B;
Copias de seguridad de MySQL
- mysqldump
- mysqlhotcopy (deprecated)
- mariabackup (fork de Percona XtraBackup)
MySQLHotCopy
mysqlhotcopy está actualmente en desuso. Sólo sirve para tablas y DB en MyIsam (no funciona con InnoDB). Actualmente el mejor sistema es usar mysqldump o bien Mariabackup que es un fork de Percona XtraBackup.
mysqldump
mysqldump [OPTIONS] database [tables]
Ejemplo básico
mysqldump -u -p base_datos > fichero.sql
A tener en cuenta:
mysqldump hace un backup completo de la base de datos pero se pueden añadir parámetros:
- sólo datos
- estructura
- eventos,
- procedimientos
- triggers
- vistas
Opciones:
- –all-databases (todas las BD)
- charset
- comprimir con (se puede comprimir el sql con gzip (sql.gz) o bzip2 (sql.bz2)
- --host -h (host o la ip (sql remoto)
- usa > para hacer la copia
- < para restaurar la copia
Siempre pedirá usuario y contraseña:
- -u o la forma larga --user=USUARIO
- -p o la forma larga --password=pass
Recuerda
que al usar el parámetro -p, la contraseña se escribirá a continuación
sin añadir ningún espacio en blanco entre -p y la contraseña.
Todas las base de datos
mysqldump [opciones] --all-databases > fichero.sql
Ejemplos comprimir con gzip
mysqldump -u dbUser -p DBName | gzip > db.sql.gz
Con bzip2
mysqldump -u dbUser -p DBName | bzip2 >db.sql.bz2
No hay comentarios:
Publicar un comentario