2012-07-27 26 views
5

Dự án của tôi có cơ sở dữ liệu riêng. Ngoài ra, tôi sử dụng bảng người dùng, trên cơ sở dữ liệu khác. Hai văn phòng có dữ liệu của họ trên cùng một máy chủ, nhưng thứ ba có bảng người dùng riêng trên máy chủ khác.Tôi cần tham gia bảng từ cơ sở dữ liệu khác và đôi khi máy chủ khác

Vì vậy, trong rất nhiều truy vấn tôi cần phải tham gia vào một trong hai some_db.users bảng hoặc other_server.some_db.users

giải pháp gì bạn sẽ tư vấn cho kịch bản này?

Tôi sử dụng MySQL.

Trả lời

13

Federated tables trong MySQL:

Các công cụ lưu trữ FEDERATED phép bạn truy cập dữ liệu từ một từ xa cơ sở dữ liệu MySQL mà không sử dụng sao chép hoặc công nghệ cluster. Truy vấn bảng FEDERATED cục bộ sẽ tự động lấy dữ liệu từ các bảng từ xa (được liên kết) từ xa. Không có dữ liệu được lưu trữ trên các bảng địa phương.

Trước tiên, bạn phải có bảng trên máy chủ từ xa mà bạn muốn truy cập bằng bảng FEDERATED. Giả sử rằng bảng từ xa là trong cơ sở dữ liệu sakila và được định nghĩa như thế này:

CREATE TABLE test_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL 
    PRIMARY KEY (id) 
) 
ENGINE=MyISAM 
DEFAULT CHARSET=latin1; 

Tiếp theo, tạo một bảng FEDERATED trên máy chủ địa phương để truy cập vào bảng điều khiển từ xa:

CREATE TABLE federated_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL 
    PRIMARY KEY (id) 
) 
ENGINE=FEDERATED 
DEFAULT CHARSET=latin1 
CONNECTION='mysql://fed_user:[email protected]:3306/sakila/test_table'; 

chuỗi kết nối mẫu:

CONNECTION='mysql://username:[email protected]:port/database/tablename' 
CONNECTION='mysql://[email protected]/database/tablename' 
CONNECTION='mysql://username:[email protected]/database/tablename' 

Cấu trúc cơ bản của bảng này phải khớp với bảng điều khiển từ xa, ngoại trừ tùy chọn bảng ENGINE được liên kết.

Execute:

show variables like '%federated%'; 

để kiểm tra xem công cụ lưu trữ FEDERATED có sẵn trên máy chủ địa phương của bạn.

Bảng federated_table trong máy chủ cục bộ sẽ trở thành bảng ảo test_table trong máy chủ từ xa.

Bây giờ bạn có thể sử dụng JOIN giữa các bảng trong một DB trong máy chủ cục bộ. Nếu có một bảng gọi là test trong máy chủ localhost của bạn, và bạn muốn kết hợp với các cựu sakila.test_table mà là ở máy chủ từ xa, hãy viết một truy vấn như hình dưới đây:

SELECT * FROM `federated_table` JOIN `test`; 

Các federated_table trong truy vấn thực sự sẽ tham chiếu đến test_table trong máy chủ từ xa.


On cho phép FEDERATED Storage Engine

Các công cụ lưu trữ FEDERATED không được kích hoạt theo mặc định trong máy chủ đang chạy; để kích hoạt FEDERATED, bạn phải khởi động nhị phân máy chủ MySQL bằng cách sử dụng tùy chọn --federated.

LƯU Ý:
Công cụ lưu trữ tùy chọn yêu cầu đặc quyền và không tải được khi --skip-grant-tables được chỉ định.

Kết quả toàn bộ db sẽ không tải và các lỗi sau sẽ xuất hiện trong các bản ghi:

110318 21:37:23 [ERROR] /usr/local/libexec/mysqld: unknown option '--federated' 

này lần lượt có nghĩa là một bản nâng cấp từ 5.x cần phải được thực hiện theo hai bước này nếu bạn có các bảng liên kết. Một lần với số --skip-grant-tables và không có --federated, một lần không có --skip-grant-tables và với --federated.

Nguồn: The FEDERATED Storage Engine

+0

cảm ơn, đặc biệt là cho hướng dẫn nhanh. tiếc là tôi gặp khó khăn khi làm cho nó hoạt động. hiển thị các biến như '% federated%'; trả về tập rỗng. Tôi tìm thấy # Vô hiệu hóa Liên kết theo mặc định bỏ qua liên kết trong my.ini, tôi đã nhận xét dòng bỏ qua và dịch vụ đã khởi động lại, tôi cũng đã thêm liên kết vào phần [mysqld] trong tệp này và khởi động lại dịch vụ. –

+0

Bạn đang sử dụng phiên bản MySQL nào? – Jacob

+0

không, được rồi .. có vẻ như nó đang hoạt động ngay bây giờ, mặc dù bộ trống rỗng quay trở lại. cảm ơn bạn:) –

0

Trong MySQL, bạn có thể tham gia bảng từ cơ sở dữ liệu khác nhau sử dụng tên đầy đủ như

`database_name1`. `table_name1` JOIN `database_name2`.`table_name2` 

Nhưng tôi sợ hãi, bạn không thể tham gia các bảng từ các máy chủ khác nhau vì cho rằng bạn cần phải có hai kết nối khác nhau và như theo kiến ​​thức của tôi, không có tên kết nối đủ điều kiện nào được sử dụng trong truy vấn.

Hoặc, bạn có thể tạo bảng tạm thời cục bộ trên một trong các máy chủ và chạy truy vấn tại đó. Nhưng trong trường hợp này, bạn sẽ cần chuyển dữ liệu từ máy chủ này sang máy chủ khác. Bạn có thể sử dụng công cụ MySQL GUI như SQLyog hoặc quản trị viên MySQL, để chuyển dữ liệu từ máy chủ này sang máy chủ khác và đồng bộ hóa cơ sở dữ liệu trên hai máy chủ.

Hy vọng nó giúp ....

Các vấn đề liên quan