Guardar y cargar datos en la tabla opciones de WordPress

Si usas WordPress como desarrollador sabrás que hay varias formas de almacenar datos sobre su base de datos sin necesidad de crear nuevas tablas. Hoy os voy a explicar una de ellas. Aparte de esta que voy a explicaros, existen básicamente dos más:

  • Para guardar tipos de datos (menos usuarios) y sus metadatos (o atributos)
  • Para guardar datos de usuarios y sus metadatos

Estructura

Esta en concreto usa la tabla opciones, wp_options o prefijo_options y para entender cómo usar las funciones y el objetivo de la misma, lo mejor es ver su forma. Esta tabla tiene la siguiente estructura:

  • option_id: su clave primaria
  • option_name: nombre de la opción
  • option_value: valor de la opción
  • option_autoload: indica si debe cargarse o no de primeras

Como veis, tenemos la estructura típica de las tablas hash: clave / valor con: option_name / option_value tan de moda ahora en bases de datos no relacionales y tan útiles. read more

Leer más » 1 Comentario

Error en MySQL: Can’t create table ‘xxx’ (errno: 150)

Soy de los que piensa que MySQL (o MariaDB si queréis algo no dependiente de Oracle) es una gran base de datos incluso para desarrollos serios y lo pongo en negrita porque todavía hoy me encuentro con muchos que defienden alternativas como Oracle DB o PostgreSQL para aplicaciones más complejas y MySQL para aplicaciones más sencillas. read more

Leer más » 3 Comentarios

Ordenando consultas con valores NULL en MySQL

MySQL logoCuando trabajamos con bases de datos, normalmente tendremos casos en los que existan valores nulos tanto en nuestras tablas como en el resultado de nuestras consultas. Sin embargo, esta realidad, también provoca que algunas acciones como las ordenaciones sean problemáticas. Para poder superar estas dificultades disponemos de funciones como coalesce() (buscad dentro del enlace).

La función coalesce()

¿Qué hace esta función? Recibe una serie de parámetros y devuelve el primero que no es nulo. read more

Leer más » 3 Comentarios

Listar todas las tablas de una base de datos en MySQL

Siempre que trabajamos con MySQL o con cualquier otro sistema gestor de bases de datos relacional tenemos la costumbre de hacer operaciones sobre las tablas y no sobre las bases de datos en sí. Básicamente lo único que hacemos es:

 USE mi_base_de_datos

O con el lenguaje que estemos usando la elegimos y trabajamos sobre ella o como mucho haciendo consultas entre varias bases de datos.

Logo MySQL

Sin embargo, hoy trabajando en un proyecto que estoy haciendo para un cliente de CODECTION, he tenido la necesidad de listar y operar sobre los nombres de las tablas de una base de datos. ¿Cómo lo he hecho? read more

Leer más » 14 Comentarios

¿Qué motor de base de datos de MySQL está usando una tabla?

MySQL es un sistema gestor de base de datos con mejores o peores consideraciones. Como punto positivo, está la posibilidad de usar más de un motor de base de datos. Básicamente dos son los más conocidos: MyISAM e InnoDB.

¿Cómo saber desde la consola de MySQL esta información? Con la siguiente orden, fijaos que el DESCRIBE TABLE no ofrece esta información, sólo la información referente al tipo de dato de cada columna, así que tenemos que usar:

SHOW TABLE STATUS WHERE Name = 'nombre_tabla'

Leer más » 1 Comentario

Guardar procedimientos, funciones y triggers en MySQL al hacer un dump

Si sois de los que aprovecháis las nuevas funcionalidades de MySQL como yo y dentro de vuestra base de datos usáis: stored procedures, functios o los famosos triggers (disparadores), os habréis dado cuenta que en vuestro dump, es decir en vuestras copias de seguridad, éstos no aparecen si los hacéis de la forma típica.

Yo me di cuenta de la mala forma, es decir, cuando recuperas el dump y te das cuenta de que no están en ningún sitio. Por eso mismo os traigo esta entrada, para que no os pase y tengáis en cuenta que si usáis este tipo de cosas, quizás debáis reformar la forma en la que llamáis a mysqldump.

Por defecto y por fortuna los triggers sí son guardados por defecto por mysqldump. Para añadir procedimientos y funciones, las llamadas rutinas, deberemos añadir el parámetro –routines, veamos:

Leer más » 2 Comentarios

Abrir acceso a MySQL desde equipos externos

Cuando trabajamos con MySQL es muy frecuente que tengamos que acceder al servidor para realizar desde equipos cliente operaciones con el mismo. Una solución muy frecuente en el mundo de la web, es ahorrarnos abrir conexiones y trabajar directamente desde dicho equipo, ¿cómo? Usando un software que se instale en el equipo servidor de base de datos y permita a la vez interactuar contra él mediante un interfaz web. Hablo de phpMyAdmin.

Sin embargo, en ocasiones, preferimos directamente conectarnos al servidor. Yo personalmente lo hago porque prefiero usar SQLyog Community sobre Wine antes que phpMyAdmin. ¿Cómo lo hacemos? Veamos:

Bind address

Lo primero es buscar en el fichero de configuración de MySQL y modificar la línea siguiente:

bind-address = 127.0.0.1

Por esta otra:

bind-address = TU_IP

Si indicamos 0.0.0.0 estamos dejando conectarnos desde cualquier dirección.

Dar permisos a nuestro usuario

La segunda parte viene derivada de dar permisos a nuestro usuario. ¿Cómo? Desde la consola de MySQL:

GRANT ALL PRIVILEGES
ON base_datos.*
TO ‘usuario’@'tu_IP'
IDENTIFIED BY 'tu_password';
Leer más » 1 Comentario

Duplicar una base de datos MySQL

Cuando estamos trabajando con datos, la mayor parte de las veces tendremos versiones que por unas razones u otras no queramos usar para pruebas. Debemos ser precavidos y tratar de evitar a toda costa de asumir riesgos en temas como éste en los que es muy fácil cubrirse las espaldas.

Una de las mejores formas de hacerlo es duplicando la estructura y los datos de una base de datos, de forma que en lugar de trabajar con la base de datos original, trabajemos con la copia hasta que estemos seguro de que todo marcha perfectamente.

MySQL Logo - Duplicar base de datos

¿Cómo copiar una base de datos en un sistema gestor de bases de datos MySQL? Aquí está el proceso:

Leer más » 4 Comentarios

¿Dónde almacena los datos MySQL?

Seguro que muchos de vosotros habréis oído hablar de MySQL e incluso otros muchos lo habréis llegado a manejar. MySQL es una base de datos relacional, en la que almacenamos datos que luego manejamos usando sentencias SQL.

MySQL logo

Sin embargo, esos datos tienen que guardarse en algún sitio. El lugar suele ser: /var/lib/mysql pero para asegurarnos, debemos mirar el fichero my.cnf. Este fichero se encuentra en:

  • Ubuntu, Debian y derivados: /etc/mysql/my.cnf
  • Red Hat, Fedora y derivados: /etc/my.cnf

Allí podemos ver el valor de datadir. La forma concreta en que se almacenan los datos dependerá del motor de almacenamiento que uses: MyISAM, InnoDB, etc.

Leer más » 7 Comentarios

PostgreSQL no arranca: “Fatal: bogus data in lock file ‘postmaster.pid'”

A raíz de un problema en la consistencia del sistema de ficheros de un servidor virtual que ejecuta PostgreSQL, he tenido que ejecutar un fsck. Tras recuperar la consistencia todos los servicios han salido andando sin problema menos el de PostgreSQL.

PostgreSQL logo

Intentaba arrancarlo con:

service postgresql start

Y nada de nada, siempre aparecía el mensaje de “FALLÓ”. Me dirigí a los logs de arranque en mi caso se encuentran en: /var/lib/pgsql dentro del fichero pgstartup.log. Tras hacerle un tail compruebo que aparece el siguiente error en el arranque:

Leer más » 4 Comentarios

Habilitar o deshabilitar rápidamente todos los plugins de WordPress desde la base de datos

Cuando sufrimos el temido “pantallazo blanco de la muerte” de WordPress, podemos estar sufriendo, entre otros problemas, una incompatibilidad entre plugins o de un plugin en particular. No podemos acceder al panel de administración y necesitamos tratar de resolverlo cuanto antes. ¿Qué hacemos? Deshabilitar todos los plugins desde la base de datos. Veamos cómo hacerlo.

WordPress Plugins

Ésto puede ser también útil no sólo para problemas de pantallazos, sino para ahorrar tiempo en la habilitación o deshabilitación de plugins.

Veamos, lo primero que tenemos que hacer es acceder a nuestra base de datos. Con los datos de inicio de sesión que tiene WordPress almacenados internamente en “wp-config.php” podemos acceder usando un cliente como:

Leer más » 1 Comentario

Instalar phpmyadmin en Ubuntu

Con el sistema recién formateado instalé Apache, PHP y MySQL, como de costumbre, pero ya iba echando algo de menos, y es que soy un enamorado de phpmyadmin.

Bien, con un sencillo paso tendremos este cliente de base de datos instalado en nuestra máquina:

ahornero@6581-D:~$ sudo apt-get install phpmyadmin

Después reiniciamos el servidor:

ahornero@6581-D:~$ sudo service apache2 restart

Y listo. Si tenemos algún problema accediendo a: http://elnombredetuhost/phpmyadmin crearemos la siguiente ruta simbólica: read more

Leer más » 1 Comentario

Permitir conexiones entrantes a un servidor PostgreSQL

Para los que venimos del mundo de MySQL y nunca antes hemos utilizado PostgreSQL, la configuración de los accesos externos a la base de datos puede parecernos algo confusa. El mecanismo, sin entrar en la tabla de gestión de usuarios, es algo más complejo pero tiene más posibilidades que en la base de datos recién adquirida por Oracle.

Veamos los pasos a dar.

1. Acceder al sistema

Para poder seguir los pasos, deberemos estar dentro del sistema, en la terminal del mismo. Si no tenemos acceso físico, podemos conectar vía ssh.

$ ssh miusuario@miservidorpgsql

2. Autenticarnos como usuario postgres

Una vez dentro del sistema, podemos hacer las operaciones como root, pero por seguridad o por si no disponemos de tales credenciales, lo mejor es actuar como usuario postgres:

su postgres

3. Permitir conexiones de clientes desde un determinado rango

Llegamos a uno de los puntos importantes de la cuestión, el fichero pg_hba.conf. Su situación exacta dependerá de vuestra instalación, pero lo encontraréis en una de estas dos rutas:

  • /var/lib/pgsql/data/pg_hba.conf (en mi instalación lo tengo ahí, utilizo Scientific Linux, una distribución derivada de Red Hat)
  • /etc/postgresql/main/pg_hba.conf

Dentro de este fichero, al final del mismo, veremos algo así:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               ident
# IPv4 local connections:
host    all         all         127.0.0.1/32          ident
# IPv6 local connections:
host    all         all         ::1/128               password

¿Qué significa esto? Veamos columna a columna:

  • Tipo: básicamente conexión local o conexión remota (host).
  • Base de datos: base de datos a las que afecta la regla. Si queremos todas, usamos el comodín all.
  • Usuario: usuarios a los que afecta la regla, si queremos que afecte a todos, usamos también all.

Nos paramos ahora en los dos apartados que más atención requieren.

3.a Dirección

En esta columna definimos, las direcciones IP (podemos también usar IPv6), desde las que podremos conectarnos a PostgreSQL. Usaremos la fórmula dirección/máscara:

  • Una sola dirección: 150.100.100.100/32
  • O un rango (ampliemos el mismo de antes): 150.100.100.0/24 (256 direcciones)

3.b Método

Aunque hay multitud de métodos para utilizar (incluyendo conexiones LDAP, Kerberos o PAM), explico los tres más básicos:

  • ident: utiliza el usuario del sistema desde el que se está intentado conectar.
  • trust: deja todos los accesos sin necesidad de autenticarse (sólo recomendable para conexiones desde el equipo local).
  • password: identificación con usuario/contraseña, es la más típica y es la recomendable para conexiones desde clientes como EMS PostgreSQL Manager.

Una línea de ejemplo, para darle acceso a todos los usuarios, a todas las base de datos, desde el rango de IP explicado antes, usando autenticación con usuario y contraseña, sería la siguiente:

host    all         all         150.100.100.0/24          password

4. Habilitar conexiones al socket desde clientes que no sean el host local

Al igual que en MySQL hay que configurar el bind-adress en my.conf, en PostgreSQL tenemos que hacer algo análogo.

Para versiones 8.x en adelante el procedimiento es el siguiente. Buscamos el fichero postgresql.conf en:

  • /var/lib/pgsql/data/postgresql.conf
  • /etc/postgresql/8.2/main/postgresql.conf

Y buscar dentro del mismo la siguiente línea:

listen_addresses='localhost'

Para sustituirla, por el comodín (para todas las IP, es una opción segura, tened en cuenta que tenemos también un filtro en el fichero pg_hba.conf.

listen_addresses='*' read more

Leer más » 10 Comentarios

¿Una base de datos completamente en la nube?

Si el otro día os hablábamos de un generador de presentaciones en la nube, hoy os presento otra idea que me ha llamado mucho la atención, una base de datos en la nube. Muchos pensaréis ya que hay servicios que podríamos considerar “bases de datos en la nube” como cualquier alojamiento con MySQL que podamos contratar en un proveedor de hosting. Sin embargo, en este caso la idea es mucho más amplia.

Su nombres database.com (¿original verdad?) y el valor añadido que tiene respecto a las bases de datos en línea “normales” es que aparte de proveer el sistema en sí, nos proporciona una herramienta gráfica con la que hacer nuestros esquemas entidad-interrelación y controlar todos los aspectos que podamos necesitar: relaciones, atributos, tablas, disparadores y hasta procedimientos almacenados. read more

Leer más » 3 Comentarios

Resetear autoincremento en MySQL

La posibilidad de generar valores automáticos para nuestras claves primarias gracias a la propiedad: AUTO_INCREMENT presente en muchos sistemas gestores de bases de datos modernos, es además de cómodo, seguro para quien lo implementa.

Sin embargo, en caso de borrar todos los datos de una tabla y volver a introducirlos, el valor del campo con AUTO_INCREMENT activado, en lugar de empezar desde 1, seguirá con la cuenta anterior. Esto es un detalle sin mucha importancia en algunos casos, pero que en algunas implementaciones puede dar problemas. Imaginemos una tabla con 10 registros con valores para su clave primaria numérica comprendidos entre 65 y 74. Sería por lo menos raro. read more

Leer más » 7 Comentarios