Akses root MySQL dari semua host

152

Saya telah menginstal server MySQL pada mesin remote Ubuntu. The rootpengguna didefinisikan dalam mysql.usertabel dengan cara ini:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Saya dapat mengakses dengan pengguna rootdari antarmuka baris perintah mesin jarak jauh yang sama menggunakan mysqlklien standar . Sekarang saya ingin mengizinkan akses root dari setiap host di internet , jadi saya mencoba menambahkan baris berikut (ini adalah duplikat yang tepat dari baris pertama dari dump sebelumnya, kecuali untuk hostkolom):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Tetapi klien saya di PC pribadi saya terus memberi tahu saya (saya mengaburkan IP server):

SQL Error (2003): Tidak dapat terhubung ke server MySQL di '46 .xxx '(10061)

Saya tidak tahu apakah itu kesalahan otentikasi atau kesalahan jaringan. Pada firewall server saya mengaktifkan port 3306 / TCP untuk 0.0.0.0/0 , dan itu tidak masalah bagi saya ...

lorenzo-s
sumber
dapatkah Anda telnet ke mesin pada port 3306
mihaisimi
3
kemungkinan besar daemon MySQL tidak mendengarkan pada 46.xxx tetapi hanya pada localhost. Carilah bind-addressdi my.cnf
Maxim Krizhanovsky
1
Jadi, dunia + anjing sekarang memiliki hash kata sandi root Anda, pengetahuan bahwa root dapat diakses dari host mana pun di Internet dan byte pertama dari alamat IP Anda. Anda tidak berpikir ini hanya kecil sedikit tentang?
eggyal
kemungkinan duplikat Aktifkan koneksi MySQL jarak jauh
pengguna

Jawaban:

362

Ada dua langkah dalam proses itu:

a) Berikan hak istimewa. Sebagai pengguna root dijalankan dengan ini mengganti 'password'dengan kata sandi root Anda saat ini:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) mengikat ke semua alamat:

Cara termudah adalah dengan mengomentari baris dalam my.cnffile Anda :

#bind-address = 127.0.0.1 

dan mulai kembali mysql

service mysql restart

Secara default ia hanya mengikat ke localhost, tetapi jika Anda berkomentar baris itu mengikat ke semua antarmuka yang ditemukannya. Mengomentari baris sama dengan bind-address=*.

Untuk memeriksa di mana layanan mysql telah diikat dijalankan sebagai root:

netstat -tupan | grep mysql

Pembaruan untuk Ubuntu 16:

File konfigurasi adalah (sekarang)

/etc/mysql/mysql.conf.d/mysqld.cnf 

(setidaknya pada standar Ubuntu 16)

hovanessyan
sumber
5
Oke, masalahnya adalah alamat yang mengikat. Terima kasih. @Darhazer Terima kasih juga :)
lorenzo-s
2
Untuk meminta hibah saat ini: `SHOW GRANTS FOR 'root' @ '%';
robsch
5
Untuk juga mengizinkan root @% untuk memberikan izin kepada pengguna lain, segera setelah langkah (a) jalankan: GRANT USAGE ON *. * UNTUK 'root' @ '%' DENGAN PILIHAN GRANT;
Caleb
1
File config adalah (sekarang) /etc/mysql/mysql.conf.d/mysqld.cnf (setidaknya pada standar Ubuntu 16)
jgp
2
Saya hanya perlu melakukan ini, untuk dapat terhubung dari jarak jauh ke server dari jarak jauh:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy
35

Jalankan kueri berikut:

use mysql;

update user set host='%' where host='localhost'

CATATAN: Tidak direkomendasikan untuk penggunaan produksi.

Babu James
sumber
2
Ini bukan solusi yang sempurna. Mungkin berhasil. Bagi saya ini menghasilkan kesalahan: ERROR 1062 (23000): Entri duplikat '% -root' untuk kunci 'PRIMARY'
Scriptlabs
2
@ Scriplabs, kemungkinan ada lebih dari satu entri di tabel pengguna dengan sejumlah 'localhost'. Dan lebih dari satu baris dengan root, termasuk root.localhost, root.127.0.0.1, root.::1. Jadi, Anda lebih baik menambahkan pengguna terpisah daripada memperbarui, itulah sebabnya saya menurunkan jawaban ini.
Mike Purcell
4
bukan FLUSH PRIVILEGES; juga perlu setelah itu?
Nom1fan
1
ini bekerja untuk saya. coba ini. update mysql.user set host='%' where user='root'
nur zazin
7

Terkadang

bind-address = 127.0.0.1

seharusnya

bind-address = *

pengguna2839051
sumber
7

MYSQL 8.0 - buka klien baris perintah mysql
GRANT ALL PRIVILEGES ON *. * UNTUK 'root' @ 'localhost';
gunakan mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Mulai ulang layanan mysql

pengguna10580057
sumber
4

MariaDB berjalan pada Raspbian - file yang berisi bind-address sulit untuk ditentukan. MariaDB memiliki beberapa informasi yang tidak terlalu membantu tentang masalah ini.

Saya menggunakan

# sudo grep -R bind-address /etc 

untuk menemukan di mana benda sialan itu.

Saya juga harus mengatur hak dan host di mysql seperti yang ditunjukkan semua orang di atas.

Dan juga bersenang-senang membuka port 3306 untuk koneksi jarak jauh ke Raspberry Pi saya - akhirnya menggunakan iptables-persistent .

Semua bekerja dengan baik sekarang.

Big Zank
sumber
1

jika Anda memiliki banyak jaringan yang terpasang pada OS Anda, Anda harus menentukan salah satu dari jaringan ini dalam add-bind dari file my.conf. sebuah contoh:

[mysqld]
bind-address = 127.100.10.234

ip ini dari konfigurasi ethX.

cardenas felipe
sumber
1
Silakan tambahkan lebih detail. Dalam file atau kerangka apa pengaturan itu perlu terjadi? Harap lebih spesifik tentang konfigurasi ethX.
BPS
1

Dalam kasus saya, pengaturan "bind-address" adalah masalahnya. Mengomentari pengaturan ini di my.cnflakukan tidak membantu, karena dalam kasus mysql saya set default ke 127.0.0.1 untuk beberapa alasan.

Untuk memverifikasi pengaturan apa yang digunakan MySql, buka baris perintah pada kotak lokal Anda:

mysql -h localhost -u myname -pmypass mydb

Bacakan pengaturan saat ini:

Show variables where variable_name like "bind%"

Anda akan melihat 0.0.0.0 di sini jika Anda ingin mengizinkan akses dari semua host. Jika ini bukan masalahnya, edit Anda /etc/mysql/my.cnfdan atur alamat-mengikat di bawah bagian [mysqld]:

bind-address=0.0.0.0

Terakhir restart server MySql Anda untuk mengambil pengaturan baru:

sudo service mysql restart

Coba lagi dan periksa apakah pengaturan baru telah diambil.

iHaveacomputer
sumber
-2

mysql_update adalah apa yang kamu butuhkan.

Saya tidak tahu mengapa ada orang yang mengikuti cara yang lebih kompleks untuk memperbaiki masalah ini, ketika MySql dengan ramah membangun alat yang sudah melakukan ini ...

Kieran Foot
sumber