Portál AbcLinuxu, 8. května 2025 17:38
Dobry den,
chci si v netbeans nakonfigurovat pripojeni k lokalni mysql databazi. Zapnu tedy mysqld daemona. Nyni si v phpmyadmin mohu prohlizet obsah databaze - to znamena, ze deamon bezi ok.
Pote spustim Netbeans, vlevo rozklinu services - Databases - drivers - Mysql (Connector/J driver) - connect using. Zde vyplnim localhost, 3306, jmeno databaze a prihlasovaci udaje, dam ok a zobrazi se mi tato hlaska:
http://img297.imageshack.us/img297/8730/netbeans.png
Nevite prosim co muze byt spatne?
Nejak nemohu najit mysqld lof, ve /var/log neni...
Konzole netbeans zustane cista.
Timto prikazem se mohu pripojit v pohode: $ mysql -p -P 3306 -u root -h localhost
Zkusil jsem program, kde se pripojim "rucne":
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class Main { public static void main(String[] args) { try { Statement stmt; Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/iis"; Connection con = DriverManager.getConnection(url, "root", "heslo0"); System.out.println("URL: " + url); System.out.println("Connection: " + con.getCatalog()); stmt = con.createStatement(); } catch(Exception se) { se.printStackTrace(); } } }
Ale ten pri kompilaci hodi
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at javaapplication62.Main.main(Main.java:15)
Ok a ktera z techto knihoven to prosim je?
/usr/share/netbeans/ide11/modules/org-netbeans-modules-db-mysql.jar /usr/share/netbeans/ide11/modules/ext/mysql-connector-java-5.1.6-bin.jar /usr/share/netbeans/ide11/modules/locale/org-netbeans-modules-db-mysql_ja.jar /usr/share/netbeans/ide11/modules/locale/org-netbeans-modules-db-mysql_pt_BR.jar /usr/share/netbeans/ide11/modules/locale/org-netbeans-modules-db-mysql_zh_CN.jar /usr/share/netbeans/ruby2/jruby-1.2.0/lib/ruby/gems/1.8/gems/jdbc-mysql-5.0.4/lib/mysql-connector-java-5.0.4-bin.jar
Tak jsem nasel, ze je to ta druha, nyni to hazi tuto chybu:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure Last packet sent to the server was 0 ms ago. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103) at com.mysql.jdbc.ConnectionImpl.init(ConnectionImpl.java:718) at com.mysql.jdbc.JDBC4Connection.init(JDBC4Connection.java:46) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at javaapplication62.Main.main(Main.java:19) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:525) at java.net.Socket.connect(Socket.java:475) at java.net.Socket.init(Socket.java:372) at java.net.Socket.init(Socket.java:215) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253) at com.mysql.jdbc.MysqlIO.init(MysqlIO.java:280) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2026) ... 12 more
mysql
) funguje – to zkoušíte na stejném počítači, kde spouštíte i tu Javovskou aplikaci?
Ano, vsechno zkousim lokalne na mem notebooku. FW by tedy za tim stat nemel.
mysql
, měl byste se na stejnou adresu připojit i z Javy. Máte na počítači zprovozněné IPv6? Napadá mne už jenom varianta, že mysqld
naslouchá jen na IPv4 a mysql
se připojuje také k němu, ale Java zkouší IPv6. Zkuste tomu javovskému programu při startu nastavit systémovou vlastnost java.net.preferIPv4Stack=true
.
Kde tu vlastnost prosim nastavim? Je to v project properties -> run -> Arguments nebo VM Options?
-D
, tedy -Djava.net.preferIPv4Stack=true
.
Ano, presne tak to mam a stale stejna chyba. Btw, proc myslite, ze se to muze tykat IPv6?
mysql
funguje a z Javy ne, a je stejná adresa, na kterou se připojujete, počítač, ze kterého se připojujete, uživatel, pod kterým to zkoušíte, nezbývá už moc věcí, v čem se to může lišit. Napadlo mne, že se mysql
může připojovat přes IPv4 a Java může zkoušet IPv6. Ještě mne napadá, zda nemáte na počítači SElinux a není v něm nastavené nějaké pravidlo, že na příslušný port se může připojit jen mysql
. Také bych vyzkoušel místo localhost:3306
použít IP adresu – 127.0.0.1:3306
.
SELinux nemam, pouzivam obycejny Arch Linux. Zadani IP misto domeny nepomohlo. Co je ale podezrele je toto:
$ sudo /etc/rc.d/mysqld start ::Starting MySQL [DONE] $ nmap -p 3306 l Starting Nmap 5.00 ( http://nmap.org ) at 2009-10-05 16:18 CEST Interesting ports on localhost (127.0.0.1): PORT STATE SERVICE 3306/tcp closed mysql Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds $ netstat -lna | grep mysql unix 2 [ ACC ] STREAM LISTENING 7180088 /tmp/mysql.sock
Daemon se spusti, pritom na dany port se jevi zavreny a v nestatu take neni videt. Pres mysql klienta se ale k DB mohu pripojit.
mysql
připojuje přes TCP/IP. Pravděpodobně se ale připojuje přes unix socket, ale java se umí připojit jen přes TCP/IP. Nemáte v konfiguráku MySQL zapnuté skip-networking
?
Ano, skip-networking bylo zapnute. Vypnul jsem ho a uz vidim mysqld na 3306. Problem ale je, ze to muj problem nevyresilo, porad to same:(
root
mohl k databázi připojit z localhost
a přes TCP/IP? Nejsem si jist, možná vypadá povolení práv pro lokální přihlášení přes TCP/IP i unix socket stejně, ale zkuste se na ta práva podívat. Případně zkuste mysql ještě jednou a přidejte parametr --protocol=TCP
, abyste i tu konzolovou utilitu zkoušel přes TCP/IP spojení.
Ano, vypada to, ze mate pravdu, s tim parametrem se nemuzu pripojit ani na localhost, pise to
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
Kde prosim nastavim ta potrebna prava?
Host
v databázi mysql
, pak ještě musíte přes administraci (třeba mysqladmin
) vynutit znovunačtení práv – ale raději se na to podívejte do dokumentace (Access Control, Stage 1: Connection Verification, Access Control, Stage 2: Request Verification), já když se jednou za uherský rok dostanu k MySQL, tak musím práva stejně pokaždé znovu hledat v dokumentaci.
Jinak ale myslím, že se pořád nenaváže TCP/IP spojení, pravděpodobně máte přístup zakázaný na firewallu. Dejte sem kdyžtak výpis iptables --line-numbers -nL INPUTpřípadně zkuste přidat pravidlo povolující přístup k MySQL z localhosta:
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
Eh, proc je to tak slozite...? Ja bych cekal ze root bude moci vsechno, tedy mozna ne uplne vse, ale pripojeni k vlastnimu pocitaci bych do toho zahrnul.
Asi budu muset prostudovat tu dokumentaci:/
Dival jsem se do tabulky Host a ta je na localhostu prazdna. Pripojil jsem se tedy na server, kde bezi debian a tam se s rootem muzu na lokalni (na serveru) db pripojit i s tim parametrem s TCP. Dival jsem se proto i tam do tabulky Host, ale i tam je prazdna, jakto?
No firewall uz jsem nastavil, ale stale...
$ sudo iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT $ sudo iptables --line-numbers -nL INPUT Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 127.0.0.1 127.0.0.1 tcp dpt:3306 $ sudo mysql -p -u root -h l --protocol=TCP Enter password: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
iptables -F INPUT
, tím jej uvedete zase do původního stavu). Vy máte nastaveno, že „l“ je také název pro 127.0.0.1
? Pomocí netstat -nltp
máte ověřeno, že mysqld
na daném portu naslouchá?
Ano, l je moje zkratka pro 127.0.0.1. Daemon na danem portu nasloucha:
$ sudo netstat -nltp | grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4267/mysqld
Bez "sudo" mi to nevypise nazev toho procesu (mysqld)
Googlil jsem tu chybu 2013 a nic moc jsem nenasel. Snad jen, ze by to mel vyresit tento prikaz:
mysql> grant all privileges on *.* to root@localhost identified by 'heslo0'; Query OK, 0 rows affected (0.00 sec)
... ale nepomohlo a vse zustava pri starem. Uz z toho zacinam byt mirne flustrovany, potrebuji to rozjet co nejdrive:(
Tak log jsem nasel ve /var/lib/mysql/, ale neni tam nic zajimaveho...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.