Es mostren els missatges amb l'etiqueta de comentaris MySQL. Mostrar tots els missatges
Es mostren els missatges amb l'etiqueta de comentaris MySQL. Mostrar tots els missatges

dimecres, 20 d’abril del 2011

Atorgant els permisos necessaris per a fer BackUp de MySQL

Si fem backup de dades MySQL amb mysqldump, necessitarem un usuari que pugui accedir a les dades únicament per a executar el backup. Els privilegis mínims que necessita són:


  • SELECT: permet la lectura dels registres.
  • LOCK TABLES: permet el bloqueig de taules, per tal de garantir la consistència de les dades guardades.
  • SHOW DATABASES: permet conèixer el directori de bases de dades existent.
  • SHOW VIEW: permet veure la definició de les vistes.
  • EXECUTE: permet executar stored procedures, necessaris per a SHOW FIELDS FROM de les vistes.
  • RELOAD: permet l'ús de FLUSH per a la neteja de la memòria cau (cache).


Així doncs, amb l'ordre GRANT crearem l'usuari de backup amb els permisos adhients:

GRANT SELECT, LOCK TABLES, SHOW DATABASES, SHOW VIEW, EXECUTE, RELOAD ON *.* to 'backup'@'host'
IDENTIFIED BY 'password';


El llistat complert de privilegis el trobarem a la documentació de MySQL.

dissabte, 16 d’abril del 2011

Com generar una contrasenya MySQL 4.1 des de PHP

A partir de la versió 4.1 de MySQL va canviar el mètode de creació de contrasenyes, la funció PASSWORD() retorna una cadena molt més gran i segura amb una encriptació unidireccional.

Si des de PHP volem generar una contrasenya validable des de MySQL ens dotarem d'aquest mètode:


/**
* Retornem una cadena entenedora per la funció PASSWORD()
* de MySQL
*
* @see http://php.net/manual/en/function.sha1.php
* @see http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password
* @param string $pwd
* @return string
*/
protected function mySqlPassword($pwd)
{
return "*" . strtoupper(sha1(sha1((string) $pwd,true)));
}

dimecres, 9 de febrer del 2011

dilluns, 31 de gener del 2011

Backup de tots els schemes MySQL un per un en un .tar.gz

Amb aquest senzill script obtindrem una còpia de seguretat de tots els schemes MySQL un per arxiu emprant mysqldump i arxivant-los tots en un arxiu comprimit tipus .tar.gz.



#!/bin/bash

# Filtrem les bases de dades per a obtenir únicament el nom
for db in `mysql -u admin -pxxx -e "show databases;" | grep "\| " | sed 1d`
do
##  Fem el volcat de les dades de la base de dades
    echo $db
    mysqldump -u admin -pxxx --routines --skip-extended-insert $db > dump.$db.sql
done
tar -zcpf sql-byDb.tar.gz dump.*
##rm -vf dump.*



Hem de substituir admin per l'usuari amb prous privilegis per a fer mysqldump i xxx per la contrasenya d'aquest.

Fem servir --routines per afegir la creació d'stored procedures si s'escau i --skip-extended-insert per a fer un insert per registre i així facilitar la trobada de diferències entre còpies.

dilluns, 27 de setembre del 2010

Xulleta d'instruccions MySQL

Els autors del llibre Get It Done With MySQL 5&6, Peter Brawley i Arthur Fuller ens ofereixen un recull de receptes mySQL molt ben endreçat.

Xulleta MySQL

dijous, 13 de maig del 2010

MySQL ssh tunel

De vegades, ja sigui per seguretat o per necessitat de saltar-se proteccions d'accés a xarxa de servidors MySQL, necessitem accedir-hi al servidor a través d'un tunel assegurat amb ssh.

Seguin les passes indicades per Marion Bates a l'article MySQL ssh tunnel Quickstart crearem ràpidament una connexió per ssh cap a un servidor MySQL.

Només cal picar en una terminal:

ssh -L 3307:nom.servidor.mysql:3306 usuari@nom.servidor.ssh

Això obre un tunel a localhost:3307 que apunta al servidorMySQL:3306 via connexió ssh.
Hem indicat el port local 3307 pq a la màquina on fem això tenim un servidor MySQL de proves.

Si la màquina oberta a ssh és la mateixa que te el servidor MySQL, nom.servidor.mysql serà localhost.

Aquesta connexió la deixarem oberta, mentre estigui activa la terminal, estarà actiu el tunel.
Per a connectar-nos, obrim el MySQL QueryBrowser i indiquem host 127.0.0.1, port el 3307 i un usuari i contrasenya vàlid per a connectar-se a la base de dades MySQL.



dilluns, 29 de març del 2010

Emulant SEQUENCE d'Oracle a MySQL

Oracle te un component força interessant per a la gestió de comptadors. És l'objecte SEQUENCE.

Per obtenir el següent valor de la seqüència executarem
SELECT nom_sequencia.nextval FROM DUAL;

A MySQL podem muntar un workarround per a emular aquesta característica d'Oracle creant una taula i dues funcions pròpies.

Creem una taula anomenada ubqSequencia on el nom de la seqüencia és clau primaria:
CREATE TABLE `ubqSequencia` (
`sqId` varchar(64) NOT NULL COMMENT 'Nom de la seqüència',
`sqCnt` bigint(20) UNSIGNED NOT NULL COMMENT 'Comptador de la seqüència',
`sqInc` int(11) NOT NULL default '1' COMMENT 'Increment per omissió de la seqüència',
`sqObs` longtext COMMENT 'Observacions',
PRIMARY KEY (`sqId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Comptadors emulem create sequence a Oracle'


Creem una funció anomenada ubqSequenciaNextVal que li passem el nom de la seqüència i ens retorna el comptador un cop incrementat. És l'equivalent a la pseudo columna NEXTVAL d'Oracle per a objectes SEQUENCE.
DELIMITER $$

DROP FUNCTION IF EXISTS `ubqSequenciaNextVal`$$
CREATE FUNCTION `ubqSequenciaNextVal`(psqId CHAR(64)) RETURNS bigint(20)
BEGIN

insert into ubqSequencia (sqId, sqCnt, sqInc) values(psqId,1,1)
on duplicate key update sqCnt = sqCnt + sqInc;

RETURN (select sqCnt from ubqSequencia where sqId = psqId);

END$$

DELIMITER ;


Aquesta funció inicialitza sempre la seqüència que em passat com a paràmetre. En cas de que salti la clau duplicada, augmenta el comptador amb l'increment establert a la mateixa taula pel mateix comptador, per omissió +1.

I la funció ubqSequenciaCurrVal que retorna el valor actual del comptador. L'equivalent a la pseudo columna CURRVAL d'Oracle pels objectes SEQUENCE.
DELIMITER $$

DROP FUNCTION IF EXISTS `ubqSequenciaCurrVal`$$
CREATE FUNCTION `ubqSequenciaCurrVal`(psqId CHAR(64)) RETURNS bigint(20)
BEGIN

RETURN (select sqCnt from ubqSequencia where sqId = psqId);

END$$

DELIMITER ;


Un dels aspectes positius de tenir els comptadors a nivell de base de dades i no per lògica de programes, és que podem actualitzar els comptadors en MySQL des d'instruccions massives. Per exemple:


update PROVA set nouComptador = ubqSequenciaNextVal('XXYYZZ');


Actualitzant el camp nouComptador de tots els registres de la taula PROVA amb la seqüència XXYYZZ. Les proves realitzades han consumit 0.0946 segons en fer la seqüència de 414 registres en un update massiu.

Certifiquem que el comptador ha quedat actualitzat

mysql> select ubqSequenciaCurrVal('XXYYZZ');
+-------------------------------+
| ubqSequenciaCurrVal('XXYYZZ') |
+-------------------------------+
| 414 |
+-------------------------------+
1 row in set (0.00 sec)


I mostrem com afegim un

mysql> select ubqSequenciaNextVal('XXYYZZ');
+-------------------------------+
| ubqSequenciaNextVal('XXYYZZ') |
+-------------------------------+
| 415 |
+-------------------------------+

dijous, 31 de desembre del 2009

Save MySQL!

Michael Widenius, fundador i primerenc desenvolupador de MySQL ens informa de que s'ha creat una campanya per a salvar la llicència GPL del MySQL.

La compra de SUN per Oracle, pot fer perillar el desenvolupament del MySQL, pedra angular de la InterNet que coneixem avui en dia.

La majoria d'aplicacions a InterNet còrren en un clàssic LAMP: Linux, Apache, MySQL i PHP, i un canvi en el model de llicència de MySQL seria catastròfic per al desenvolupament de la xarxa, doncs el fet de poder tenir un entorn de programació totalment OpenSource aporta un munt d'aplicacions al consum de la xarxa de xarxes.

És important donar suport a aquesta petició abans del 4 de gener del 2010:


dissabte, 12 de desembre del 2009

Importar dades CSV a MySQL

Per a importar un arxiu de dades separades per comes (CSV) a una taula MySQL, emprarem la instrucció LOAD DATA INFILE:

load data local infile 'categories.csv'
into table categories
fields terminated by ','
enclosed by '"'
lines terminated by "\n"
(catCodi, catDesc);


Tots els fulls de càlcul permeten la exportació a CSV, pel que amb aquesta senzilla instrucció podrem importar ràpidament dades a MySQL.

dijous, 24 de setembre del 2009

MySQL WorkBench 5.1.18 per a Ubuntu

MySQL WorkBench és un assistent al disseny de bases de dades MySQL. El podeu descarregar des d'ací.És força complert, i molt útil el poder fer enginyeria inversa i a partir d'una base de dades ja consolidada recuperar la definició al banc de treball.

Es pot fer el seguiment de la versió Alpha via Twitter.

dilluns, 15 de juny del 2009

Instal·lació d'un entorn de desenvolupament PHP

Presentació a la PHP TestFest del 2009 sobre com instal·lar un entorn de desenvolupament PHP integral amb cost zero

dimecres, 10 de juny del 2009

Girant dates timestamp de MySQL a Pantalla i viceversa

Amb aquesta funció de quatre línies de codi, aconseguirem girar una data Timestamp, data + hora, tant si ens arriba en format MySQL yyyy-mm-dd hh:ii:ss com si ens arriba de pantalla en format europeu dd/mm/yyyy hh:ii:ss


/**
* Girem una data/hora en format MySQL a *EUR i viceversa
*
* @param string $timestamp
* @return string
*/
function giraTimestamp($data)
{
/**
* Mirem que la cadena compleixi amb els requisits de :
* entre 1 i 4 posicions decimals
* seguit d'un separador vàlid
* seguit d'entre 1 i 2 posicions decimals
* seguit d'un separador vàlid
* seguit d'entre 1 i 4 posicions decimals
* seguit d'un espai
* seguit d'entre 1 i 2 posicions decimals
* seguit d'un separador :
* seguit d'entre 1 i 2 posicions decimals
* seguit d'un separador : o no, doncs els segons no són obligatoris
* seguit d'entre 0 i 2 posicions decimals
*
* guardant-nos les xifres d'any, mes i dia i la data complerta
*/
if (preg_match('/(\d{1,4})[\-\/\.](\d{1,2})[\-\/\.](\d{1,4})\s(\d{1,2}\:\d{1,2}\:?\d{0,2})/', $data, $jData))
{
/**
* Esborrem la primera possició de l'array resultant que és la cadena
* que s'ha parsejat.
*/
array_shift($jData);

/**
* Extraiem de l'array l'hora:minut:segon
*/
$jHora = array_splice($jData, 3);

/**
* Si la primera xifra te 4 posicions, vol dir que venim de
* MySQL, i representarem la data girada amb / com a separador
* En cas contrari, vol dir que venim de pantalla, i el
* separador serà l'standard de MySQL.
*/
if (strlen($jData[0]) == 4)
{
$separador = '/';
}
else
{
$separador = '-';
}

/**
* Retornem la data
*
* girem l'array que conté any,mes,dia o dia,mes,any
* la convertim a una cadena separant cada element pel separador calculat
* afegim espai blanc i l'hora complerta
*/
$ret = implode($separador, array_reverse($jData)) . ' ' . $jHora[0];

return $ret;
}
}


Per als camps de tipus date, que no tenen l'hora, la cadena de parseig serà:


/(\d{1,4})[\-\/\.](\d{1,2})[\-\/\.](\d{1,4})/

dilluns, 1 de juny del 2009

Visualitzar clients AbanQ a dotProject

A Corretgé.com hem decidit implementar el gestor de projectes dotProject 2.1.2 i adaptar-lo a les nostres necessitats.
El primer que farem serà que el llistat de companyies del dotProject es correspongui amb la relació de clients de l'AbanQ i així evitar haver d'entrar les fitxes a les dues aplicacions:
Prèvia còpia de seguretat de les dades, arrenquem el MySQL i emprem la base de dades on tenim el dotProject i esborrem la taula companies:
drop table companies

I procedim a la creació de la vista basada en les dades de client de l'AbanQ que tenim en aquest cas a la base de dades crtfaclux. A la relació de clients d'AbanQ també ha d'existir la nostra pròpia empresa, que identificarem com de tipus 6, Interna, que la detectem pel NIF:
create view companies as
select c.codcliente as company_id,
0 as company_module,
convert(c.nombre USING utf8) as company_name,
c.telefono1 as company_phone1,
c.telefono2 as company_phone2,
c.fax as company_fax,
convert(d.direccion USING utf8) as company_address1,
convert(d.provincia USING utf8) as company_address2,
convert(d.ciudad USING utf8) as company_city,
d.codpais as company_state,
d.codpostal as company_zip,
substring_index(c.email, '@', -1) as company_primary_url,
1 as company_owner,
convert(c.nombrecomercial USING utf8) as company_description,
CASE c.cifnif
when 'B17803586' then 6
else 1
end as company_type,
c.email as company_email,
convert(c.contacto USING utf8) as company_custom
from crtfaclux.clientes c
left join crtfaclux.dirclientes d on c.codcliente = d.codcliente and d.domfacturacion = 1


Si accedim al llistat de companyies de dotProject trobarem integrades tots els nostres clients, assigants com a owner de la companyia l'administrador del dotProject. Aquest camp no es pot canviar. Si es necessita canviar dades, el que haurem de fer és integrar-les de manera periòdica i no pas crear una vista.

dilluns, 20 d’abril del 2009

Oracle comprarà SUN

En Toni Hermoso informa d'una notícia Bomba: Oracle comprarà SUN per 7.400 milions de dollars, uns 5.700 milions d'Euros (els USA empren el que s'anomena Short Scale per a quantificiar un bil·lió).

Pagaran 9,5 USD per acció, preu de cotització de SUN a l'agost del 2008, molt per sobre dels 6,5 actuals i el doble dels 4,75 que cotitzaven abans del 17 de març, data en que es van fer públics els rumors de que IBM volia comprar SUN per 7.000 milions d'USD. SUN va trobar insuficient l'oferta d'IBM i van trencar unes converses molt avançades el 6 d'abril.L'aposta d'IBM era força interessant per al món Open Source: Assegurava la seva aposta per Java com a llenguatge inter-plataforma de propòsit general i mantenia desenvolupament de MySQL, com demostra la creació de l'IBMSB2i Storage Engine per a MySQL de l'AS/400.

L'aposta d'Oracle potser va més enrutada en assegurar-se poder servir als seus clients sol·lucions integrades amb maquinari, de fet històricament Oracle i SUN havien anat del braçet.

Possiblement també controlar els gestors de bases de dades que suporten SAP i potser incorporar a Oracle algunes de les funcionalitats de MySQL i viceversa. Seria fantàstic la creació d'un Oci Storage Engine per a MySQL ;-)

dimarts, 10 de març del 2009

Esborrar registres per clau duplicada MySQL

Una bona manera d'esborrar registres per clau duplicada en MySQL és creant un índex UNIQUE amb la instrucció IGNORE.
ALTER IGNORE TABLE `taula` ADD UNIQUE KEY (`campClau`);
Si s'especifica IGNORE, només la primera fila és manté. Les altres files en conflicte són esborrades. Valors incorrectes seran truncats al valor més proper que esdevingui un valor acceptable.

Més informació al manual ALTER TABLE de MySQL

dimarts, 17 de febrer del 2009

BackUp MySQL registre a registre

Per omissió mysqldump genera un únic INSERT amb tots els registres de la taula. Això és interessant si el que necessitem és optimitzar el procés de backup i restore, però ens limita les opcions de depuració.

Per a obtenir un backup d'una base de dades MySQL amb un INSERT per cada registre, afegirem l'opció
--skip-extended-insert
I amb un KDiff o qualsevol altre comparador d'arxius, podrem depurar els canvis en una base de dades registre a registre.

dilluns, 16 de febrer del 2009

BackUp de Stored Procedures en MySQL

Afegint --routines com a paràmetre de mysqldump, aconseguirem que el volcat de dades de la base de dades triada inclogui les funcions pròpies.

Si únicament volem obtenir un BackUp d'aquestes rutines (procediments i funcions), executarem:
mysqldump -u root -p --no-create-info --no-data --routines BaseDades > BaseDades.rutines.sql

dilluns, 26 de gener del 2009

Camps amb la data del sistema

A MySQL (provat amb versió 5.0.51) podem especificar com a valor per omissió d'un camp data/hora de tipus TIMESTAMP la data del sistema:

`datModif` timestamp NOT NULL default CURRENT_TIMESTAMP


Si a més a més també volem tenir la data de modificació del registre, fariem:

`datModif` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP


Per a que adopti el valor per omissió, indicarem NULL com a valor a l'hora de fer l'INSERT.

La limitació de MySQL en MyISAM, almenys, és que només podem definir aquesta característica a un únic camp de la taula.

divendres, 19 de setembre del 2008

Instal·lant un servidor LAMP a Ubuntu

LAMP és l'acrònim de Linux, Apache, MySQL i PHP. És com es coneix el sistema de servidor d'aplicacions web més estès arreu d'InterNet.
La instal·lació és molt senzilla, només cal executar aquestes instruccions:
sudo apt-get install apache2
sudo apt-get install mysql-server
sudo apt-get install php5 php5-mysql php5-gd
si fem http://localhost visualitzarem la plana situada a /var/www/

dilluns, 28 d’abril del 2008

Alliberada la versió 5.0.21 de MySQL Workbench

Alliberada la primera revisió des de que MySQL Workbench es va oficialitzar com a GA (General Availability)
Aquí hi ha l'historial de versions.

Desgraciadament només l'han alliberat per a plataforma Windows, a diferència de la resta de GUI Tools.