• Publicidad

No puedo conectar MySQL con DBI-Link de PostgreSQL

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor Marvin » 2012-04-08 17:41 @778

Hola, foro,
Hace días estoy intentando de resolver este error:

NOTICE: SELECT dbi_link.set_up_connection(
'dbi:mysql:database=webdb;host=192.168.1.106;port=3306',
'root',
'root',
'---
AutoCommit: 1
RaiseError: 1
',
NULL,
NULL,
NULL,
'webdb'
)
NOTICE: SELECT count(*) AS "driver_there"
FROM dbi_link.available_drivers()
WHERE 'dbi:mysql:database=webdb;host=192.168.1.106;port=3306' like '%' || available_drivers || '%'

CONTEXTO: sentencia SQL: «SELECT dbi_link.set_up_connection(
'dbi:mysql:database=webdb;host=192.168.1.106;port=3306',
'root',
'root',
'---
AutoCommit: 1
RaiseError: 1
',
NULL,
NULL,
NULL,
'webdb'
)
»
NOTICE: Warning: something's wrong at line 43.

CONTEXTO: sentencia SQL: «SELECT dbi_link.set_up_connection(
'dbi:mysql:database=webdb;host=192.168.1.106;port=3306',
'root',
'root',
'---
AutoCommit: 1
RaiseError: 1
',
NULL,
NULL,
NULL,
'webdb'
)
»
Resultado de la consulta con 1 filas descartadas.

ERROR: error en la función de Perl «make_accessor_functions»: error en la función de Perl «set_up_connection»: DBI connect('database=webdb;host=192.168.1.106;port=3306','root',...) failed: Can't connect to MySQL server on '192.168.1.106' (13) at line 44 at line 35.

********** Error **********

ERROR: error en la función de Perl «make_accessor_functions»: error en la función de Perl «set_up_connection»: DBI connect('database=webdb;host=192.168.1.106;port=3306','root',...) failed: Can't connect to MySQL server on '192.168.1.106' (13) at line 44 at line 35.
Estado SQL:XX000


Esta es la invocación de la función que arroja el error:
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT make_accessor_functions(
  2.     'dbi:mysql:database=webdb;host=192.168.1.106;port=3306',
  3.     'root',
  4.     'root',
  5.     '---
  6. AutoCommit: 1
  7. RaiseError: 1
  8. ',
  9. NULL,
  10.     NULL,
  11.     NULL,
  12.     'webdb'
  13. );
  14.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Soy nuevo en Perl, me estrené con esta herramienta de PostgreSQL: DBI-Link. Bueno, esta función es llamada desde otra función (como se ve en el error) pero la línea exacta del error es 46. A continuación la función:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. CREATE OR REPLACE FUNCTION dbi_link.set_up_connection(data_source dbi_link.data_source, user_name text, auth text, dbh_attributes dbi_link.yaml, dbi_connection_environment dbi_link.yaml, remote_schema text, remote_catalog text, local_schema text)
  2.   RETURNS integer AS
  3. $BODY$
  4.  
  5. spi_exec_query('SELECT dbi_link.dbi_link_init()');
  6.  
  7. my ($params, $quoted);
  8. foreach my $param (qw(data_source user_name auth dbh_attributes
  9.     dbi_connection_environment remote_schema remote_catalog
  10.     local_schema)) {
  11.     $params->{ $param } = shift;
  12.     IF ( defined $params->{ $param } ) {
  13.         $quoted->{ $param } = $_SHARED{quote_literal}->(
  14.             $params->{ $param }
  15.         );
  16.     }
  17.     else {
  18.         $quoted->{ $param } = 'NULL';
  19.     }
  20. }
  21.  
  22. my $driver = $_SHARED{quote_literal}->(
  23.     $params->{data_source}
  24. );
  25.  
  26. #my $sql = <<SQL;
  27. #SELECT count(*) AS "driver_there"
  28. #FROM dbi_link.available_drivers()
  29. #WHERE available_drivers = $driver
  30. #SQL
  31.  
  32. my $sql = <<SQL;
  33. SELECT count(*) AS "driver_there"
  34. FROM dbi_link.available_drivers()
  35. WHERE $driver LIKE '%' || available_drivers || '%'
  36. SQL
  37.  
  38. warn $sql IF $_SHARED{debug};
  39. my $driver_there = spi_exec_query($sql);
  40. IF ($driver_there->{processed} == 0) {
  41.     die "Driver $driver is not available.  Can't look at database."
  42. }
  43.  
  44. my $attr_href = LOAD($params->{dbh_attributes});
  45. warn $dbh IF $_SHARED{debug};
  46. my $dbh = DBI->connect(
  47.     $params->{data_source},
  48.     $params->{user_name},
  49.     $params->{auth},
  50.     $attr_href,
  51. );
  52.  
  53. IF ($DBI::errstr) {
  54.     die <<ERR;
  55. Could NOT connect TO DATABASE
  56. DATA source: $params->{data_source}
  57. user: $params->{user_name}
  58. password: $params->{auth}
  59. dbh attributes:
  60. $params->{dbh_attributes}
  61.  
  62. $DBI::errstr
  63. ERR
  64. }
  65.  
  66. my @methods = qw(table_info column_info quote);
  67. foreach my $method (@methods) {
  68.     warn "Checking whether $driver has $method..." IF $_SHARED{debug};
  69.     IF ($dbh->can($method)) {
  70.         warn "$driver has $method <img src="http://perlenespanol.com/foro/images/smilies/icon_smile.gif" alt=":)" title="Smile" />" IF $_SHARED{debug};
  71.     }
  72.     else {
  73.         die (<<ERR);
  74. DBD driver $driver does NOT have the $method method, which IS required
  75. FOR DBI-Link TO work.  Exiting.
  76. ERR
  77.     }
  78. }
  79.  
  80. my $sql = <<SQL;
  81. INSERT INTO dbi_link.dbi_all_connection_info (
  82.     data_source,
  83.     user_name,
  84.     auth,
  85.     dbh_attributes,
  86.     dbi_connection_environment,
  87.     remote_schema,
  88.     remote_catalog,
  89.     local_schema
  90. ) VALUES (
  91.     $quoted->{data_source},
  92.     $quoted->{user_name},
  93.     $quoted->{auth},
  94.     $quoted->{dbh_attributes},
  95.     $quoted->{dbi_connection_environment},
  96.     $quoted->{remote_schema},
  97.     $quoted->{remote_catalog},
  98.     $quoted->{local_schema}
  99. )
  100. SQL
  101.  
  102. warn $sql IF $_SHARED{debug};
  103. my $rv = spi_exec_query(
  104.     $sql
  105. );
  106.  
  107. $sql = <<SQL;
  108. SELECT
  109.     pg_catalog.currval(
  110.         pg_catalog.pg_get_serial_sequence(
  111.             'dbi_link.dbi_connection',
  112.             'data_source_id'
  113.         )
  114.     ) AS "the_val"
  115. SQL
  116. warn $sql IF $_SHARED{debug};
  117. my $result = spi_exec_query($sql);
  118. IF ($result->{processed} == 0) {
  119.     die "Couldn't retrieve the dbi connection id via currval()!";
  120. }
  121. else {
  122.     RETURN $result->{rows}[0]{the_val};
  123. }
  124. $BODY$
  125.   LANGUAGE plperlu VOLATILE
  126.   COST 100;
  127. ALTER FUNCTION dbi_link.set_up_connection(dbi_link.data_source, text, text, dbi_link.yaml, dbi_link.yaml, text, text, text) OWNER TO postgres;
  128.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Puedo conectarme desde la consola al servidor MySQL así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@centos6 mysql]# mysql -h 192.168.1.106 -u root -p webdb
  2. Enter password:
  3. Reading table information for completion of table and column names
  4. You can turn off this feature to get a quicker startup with -A
  5.  
  6. Welcome to the MySQL monitor.  Commands end with ; or \g.
  7. Your MySQL connection id is 3
  8. Server version: 5.5.21 MySQL Community Server (GPL)
  9.  
  10. Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
  11.  
  12. Oracle is a registered trademark of Oracle Corporation and/or its
  13. affiliates. Other names may be trademarks of their respective
  14. owners.
  15.  
  16. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  17.  
  18. mysql>
  19.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


También verifiqué que el puerto esté abierto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@centos6 mysql]# telnet 192.168.1.106 3306
  2. Trying 192.168.1.106...
  3. Connected to 192.168.1.106.
  4. Escape character is '^]'.
  5. J
  6. 5.5.21,]rEC\)�Qtwxt^Y$Dkpnmysql_native_passwordConnection closed by foreign host.
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, he intentado también crear una función para una conexión de prueba y me respondió con el mismo error:

ERROR: error en la función de Perl «probando»: DBI connect('host=192.168.1.106;database=webdb','webdb_user',...) failed: Can't connect to MySQL server on '192.168.1.106' (13) at line 14

********** Error **********

ERROR: error en la función de Perl «probando»: DBI connect('host=192.168.1.106;database=webdb','webdb_user',...) failed: Can't connect to MySQL server on '192.168.1.106' (13) at line 14
Estado SQL:XX000


Ésta es la función:
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. CREATE OR REPLACE FUNCTION probando()
  2.   RETURNS bit AS
  3. $BODY$
  4.  
  5. USE strict;
  6. USE DBI;
  7.  
  8. my $db_user = "webdb_user";
  9. my $db_pass = "pass";
  10. my $host_name = "192.168.1.106";
  11. my $db_name = "webdb";
  12.  
  13. my $q_string = "DBI:mysql:host=$host_name;database=$db_name";
  14.  
  15. my $dbh = DBI->connect ($q_string, $db_user, $db_pass,
  16. {PrintError => 1, RaiseError => 1}) OR die DBI::errstr;
  17.  
  18. RETURN 0
  19.  
  20. $BODY$
  21.   LANGUAGE plperlu VOLATILE
  22.   COST 100;
  23. ALTER FUNCTION probando() OWNER TO nsadmin;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otro intento fue agregarle la sección [client] en my.cnf con el puerto y socket igual que [mysqld] en el servidor: 192.168.1.106.

Desde ya, gracias, perdón por la longitud del mensaje, pero es la única manera que encontré de explicarles mi calvario :shock:

Ojalá y puedan ayudarme :)
Marvin
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-04-08 15:45 @698
Ubicación: Luque, Central, Paraguay

Publicidad

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor explorer » 2012-04-08 19:19 @846

Bienvenido a los foros de Perl en Español, Marvin.

Yo, en principio, no veo errores...

Yo haría la prueba de intentar conectarme a la MySQL desde Perl, directamente, no dentro de PostgreSQL.

De todas maneras, asegúrate que en el fichero de configuración my.cnf tengas algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using ini Syntax Highlighting
  1. [client]
  2. port = 3306
  3. socket = /var/lib/mysql/mysql.sock
  4.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La parte importante es la del socket.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor Marvin » 2012-04-08 20:53 @911

Hola,

Muchas gracias por la pronta respuesta :)

Hice la prueba fuera de PostgreSQL, y me pude conectar exitosamente, al menos sé que funciona así (aunque no me sirve conectarme desde afuera sino desde PostgreSQL):
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [root@centos6 marvin]# perl probando.pl
  2. AL FIN! DBI:mysql:host=192.168.1.106;database=webdb
  3. Bases de datos:
  4. information_schema
  5. mysql
  6. performance_schema
  7. test
  8. webdb
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y reutilicé el mismo código que usé en PostgreSQL para la prueba (agregando un query: "show databases;") así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use DBI;
  6.  
  7. my $db_user = "webdb_user";
  8. my $db_pass = "pass";
  9. my $host_name = "192.168.1.106";
  10. my $db_name = "webdb";
  11.  
  12. my $q_string = "DBI:mysql:host=$host_name;database=$db_name";
  13.  
  14. my $dbh = DBI->connect ($q_string, $db_user, $db_pass,
  15. {PrintError => 1, RaiseError => 1}) or die DBI::errstr;
  16.  
  17. print "AL FIN! $q_string \n";
  18.  
  19. my $sth = $dbh->prepare("show databases;");
  20. $sth->execute();
  21.  
  22. my $row;
  23. print "Bases de datos: \n";
  24. while($row = $sth->fetchrow_arrayref) {
  25.     print "$row->[0]\n";
  26. }
  27.  
  28. $sth->finish();
  29.  
  30. $dbh->disconnect || warn "\nFallo al desconectar.\nError: $DBI::errstr\n";
  31.  
  32. exit;
  33.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡Ah! y efectivamente, las líneas en [client] tiene el socket bien puesto, por decirlo.

¿Alguna idea de por qué no corre el script en PostgreSQL? El lenguaje es plperlu, también soporta el plperl aunque es más limitado que el anterior.

Estaré infinitamente agradecido :)
Marvin
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-04-08 15:45 @698
Ubicación: Luque, Central, Paraguay

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor explorer » 2012-04-09 06:21 @306

Pues es que yo no veo errores... Lo único que se me ocurre es
que cambies la cadena de descripción de la conexión a algo así:

'dbi:mysql:servidor:base_de_datos'

pero es que lo que tienes sí que está bien, porque funciona
aparte.

P.D. Ahora no recuerdo si es justo al revés: 'base_de_datos:servidor'
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor explorer » 2012-04-09 06:34 @315

Un detalle...

Para el caso de DBD::mysql...

Si no se indica el servidor, o se indica '', o se usa 'localhost', entonces la conexión es a la máquina local usando el socket UNIX.

En cambio, si se especifica '127.0.0.1', la conexión se hará vía TCP por el puerto 3306 o por el indicado por 'port=', o con '127.0.0.1:puerto' en caso de que el puerto no sea el estándar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor Marvin » 2012-04-09 20:21 @889

Hola de nuevo :) ¡Y gracias!

Pude editar la cadena de descripción de la conexión así:

'dbi:mysql:webdb:192.168.1.106:3306' y también de esta manera:
'dbi:mysql:webdb:192.168.1.106'

pero el mismo error persiste...

Como nota, desde PostgreSQL tampoco puedo conectar a una base MySQL en mi localhost.

¿Qué podría ser que desde PostgreSQL no conecta a MySQL? Ya pude conectarme a otras bases (PostreSQL con Pg) en otros servidores...

Ojalá hallemos la solución :wink:
Marvin
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-04-08 15:45 @698
Ubicación: Luque, Central, Paraguay

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor Marvin » 2012-04-10 11:03 @502

Hola, Sres.

No sé si sea un disparate, pero creo que al archivo my.cnf de MySQL le falta una directiva así como [mysqld] y [client], algo que permita conectarse desde PostgreSQL.

Les digo esto porque hice una pequeña función en pltclu para conectarme a MySQL y me arroja el mismo error que con plperlu.

Antes, en Tcl, fuera de PostgreSQL, logré conectarme sin problemas con el mismo script de la función pltclu (así como hicimos el intento con Perl fuera de PostgreSQL).

¿Qué podría acontecer? Se me hace que es algo de la configuración de MySQL :(

¿Alguna idea? (ya me estoy quedando sin ellas)

¡Muchas gracias, nuevamente!
Marvin
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-04-08 15:45 @698
Ubicación: Luque, Central, Paraguay

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor explorer » 2012-04-10 14:10 @632

Es que yo creo que es básico que en ese archivo esté descrito lo mínimo del funcionamiento de MySQL.

Te pongo el comienzo de uno de mis servidores:

Sintáxis: [ Descargar ] [ Ocultar ]
Using ini Syntax Highlighting
  1. [client]
  2. port            = 3306
  3. socket          = /var/run/mysqld/mysqld.sock
  4.  
  5. # Here is entries for some specific programs
  6. # The following values assume you have at least 32M ram
  7.  
  8. # This was formally known as [safe_mysqld]. Both versions are currently parsed.
  9. [mysqld_safe]
  10. socket          = /var/run/mysqld/mysqld.sock
  11. nice            = 0
  12.  
  13. [mysqld]
  14. #
  15. # * Basic Settings
  16. #
  17. user            = mysql
  18. pid-file        = /var/run/mysqld/mysqld.pid
  19. socket          = /var/run/mysqld/mysqld.sock
  20. port            = 3306
  21. basedir         = /usr
  22. datadir         = /var/lib/mysql
  23. tmpdir          = /tmp
  24. language        = /usr/share/mysql/spanish
  25. skip-external-locking
  26.  
  27. #
  28. # Instead of skip-networking the default is now to listen only on
  29. # localhost which is more compatible and is not less secure.
  30. #bind-address           = 127.0.0.1
  31. bind-address            = 0.0.0.0
  32.  
  33.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

No está todo, hay muchas más líneas con más opciones para [mysqld]. Y termina con las secciones
[mysqldump], [mysql] e [isamchk], finalizando con un !includedir /etc/mysql/conf.d/ .

De esto precisamente hemos estado hablando en los mensajes anteriores: este archivo de configuración define qué
posibilidades de conexión debe ofrecer mysqld a los clientes.

Fíjate que nosotros le tenemos puesto para que escuche (bind-address) en todas las IP de la máquina. De esta
manera también damos servicio a los clientes que se conectan desde fuera. Pero esto no es lo normal, además de ser
peligroso si la máquina es visible desde Internet.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor Marvin » 2012-04-11 14:08 @630

Hola de nuevo :)

Así tengo mi archivo my.cnf (espero no sea nada alocado :o) basado en el archivo de ejemplo my-large.cnf.
Sintáxis: [ Descargar ] [ Ocultar ]
Using ini Syntax Highlighting
  1. [client]
  2. port            = 3306
  3. socket          = /var/lib/mysql/mysql.sock
  4.  
  5. [mysqld_safe]
  6. log-error       = /var/log/mysqld.log
  7. pid-file        = /var/run/mysqld/mysqld.pid
  8. socket          = /var/lib/mysql/mysql.sock
  9. nice            = 0
  10.  
  11. [mysqld]
  12. port               = 3306
  13. datadir            = /var/lib/mysql
  14. basedir            = /usr
  15. tmpdir             = /tmp
  16. socket             = /var/lib/mysql/mysql.sock
  17. user               = mysql
  18. # Disabling symbolic-links is recommended to prevent assorted security risks
  19. # symbolic-links= 0
  20. pid-file           = /var/run/mysqld/mysqld.pid
  21. skip-external-locking
  22. bind-address       = 0.0.0.0
  23. key_buffer_size = 256M
  24. max_allowed_packet = 1M
  25. table_open_cache = 256
  26. sort_buffer_size = 1M
  27. read_buffer_size = 1M
  28. read_rnd_buffer_size = 4M
  29. myisam_sort_buffer_size = 64M
  30. thread_cache_size = 8
  31. query_cache_size= 16M
  32. # Try number of CPU's*2 for thread_concurrency
  33. thread_concurrency = 8
  34.  
  35. [mysqldump]
  36. quick
  37. max_allowed_packet = 16M
  38.  
  39. [mysql]
  40. no-auto-rehash
  41. # Remove the next comment character if you are not familiar with SQL
  42. #safe-updates
  43.  
  44. [myisamchk]
  45. key_buffer       = 128M
  46. sort_buffer_size = 128M
  47. read_buffer      = 2M
  48. write_buffer     = 2M
  49.  
  50. [mysqlhotcopy]
  51. interactive-timeout
  52.  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Esto está correcto?

Perdón por la insistencia. Y a veces el desatino, pero me es indispensable conectarme desde PostgreSQL.

¿No habría forma de forzar la conexión? Es decir, pedirle a mi $dbh leer lo que dice el grupo [client] o todo el archivo de configuración...
Marvin
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-04-08 15:45 @698
Ubicación: Luque, Central, Paraguay

Re: No puedo conectar MySQL con DBI-Link de PostgreSQL

Notapor explorer » 2012-04-11 14:49 @659

Yo lo veo bien... Tampoco es tan complicado...

A ver... si con un programa Perl aparte, no hay problemas de conexión a MySQL, entonces para mí el sistema funciona. Y lo que debe estar mal es la conexión desde dentro de PostgreSQL.

Hay que mirar los logs de actividad, tanto de PostgreSQL como de MySQL, para ver si ahí indica alguna pista más.

Podría ser tan tonto como que PostgreSQL no tuviese permiso de lectura del socket /var/lib/mysql/mysql.sock en caso de que la conexión fuera así, pero entonces no debería haber problemas si fuera la conexión vía TCP.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado