// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Configurando o Servidor de Banco de Dados MySQL no Sistema Operacional Windows

O servidor de banco de dados MySQL é um dos mais populares servidores de banco de dados de código-fonte aberto geralmente utilizado no desenvolvimento de aplicações Web.

Este documento recomenda uma sequência de etapas para configurar o servidor de banco de dados MySQL versões 5.6 no sistema operacional Windows. Ele não aborda os detalhes da configuração do MySQL, descreve a sequência de etapas necessária.

Para obter mais informações sobre instalação e configuração do servidor de banco de dados MySQL em outros sistemas operacionais, consulte a documentação link:http://dev.mysql.com/doc/refman/5.6/en/installing.html[+Instalando e Atualizando o MySQL+].

*Observação:* o documento link:../../72/ide/install-and-configure-mysql-server.html[+Configurando as versões do MySQL Database Server 5.1 no Sistema Operacional Windows+] oferece as instruções sobre configuração das versões 5.1 do MySQL Server no Windows.





== Iniciando o Download

1. Vá para link:http://dev.mysql.com/downloads/installer/[+http://dev.mysql.com/downloads/installer/+].
2. Clique no botão Fazer download.
3. Salve o arquivo do instalador no sistema.

<<top,início>>


== Iniciando a Instalação

Após concluir o download, execute o instalador, como a seguir:

1. Clique com o botão direito do mouse no arquivo de instalação transferido por download (por exemplo,  ``mysql-installer-community-5.6.10.0.msi`` ) e clique em Executar.
O Instalador do MySQL é iniciado.
2. No painel de Boas-Vindas, selecione Instalar Produtos MySQL.
3. No painel Informações da Licença, examine o contrato de licença, clique na caixa de seleção de aceitação e clique em Próximo.
4. No painel Localizar produtos mais recentes, clique em Executar. 
Quando a operação for concluída, clique em Próximo.
5. No painel Tipo de Configuração, escolha a opção Personalizada e clique em Próximo.
6. No painel Seleção de Funcionalidade, verifique se MySQL Server 5.6.x foi selecionado e clique em Próximo.
7. No painel Verificar Requisitos, clique em Próximo.
8. No painel Instalação, clique em Executar.
Quando a instalação do servidor é concluída com sucesso, a mensagem de informações é exibida no painel Instalação. Clique em Próximo.
9. No painel Configuração, clique em Próximo.
10. Na primeira página Configuração do Servidor MySQL (1/3), consulte as opções a seguir:
* *Tipo de Configuração do Servidor*. Selecione a opção Máquina de Desenvolvimento.
* *Ativar Rede de TCP/IP*. Verifique se a caixa de seleção foi selecionada e especifique as opções abaixo:
* *Número da Porta*. Especifique a porta de conexão. A definição default é 3306 - não altere-a se não houver um motivo especial para isso.
* *Abra a porta do Firewall para obter acesso à rede*. Opte por adicionar a exceção de firewall para a porta especificada.
* *Configuração Avançada.* Marque a caixa de seleção Mostrar Opções Avançadas para exibir uma página adicional de configuração para definir opções avançadas para a instância do servidor, se necessário.

*Observação:* a escolha desta opção é necessária para se chegar ao painel para definir as opções de rede onde você desativará o firewall da porta usada pelo servidor MySQL.

Clique em Próximo.
11. Na segunda página Configuração do Servidor MySQL (2/3), consulte as opções a seguir:
* *Senha da Conta Root*.
* *Senha Root de MySQL*. Informe senha para o usuário root.
* *Repita a Senha*. Digite novamente a senha root do usuário.

*Observação:* o usuário-raiz é um usuário que possui acesso total ao servidor de banco de dados MySQL - criação, atualização e remoção de usuários e assim por diante. Guarde a senha-raiz - você precisará dela posteriormente ao criar um banco de dados de amostra.

* *Contas do Usuário MySQL*. Clique em Adicionar Usuário para criar uma conta do usuário. Na caixa de diálogo Detalhes de Usuário do MySQL, insira um nome de usuário, uma função do banco de dados e uma senha (por exemplo,  ``!phpuser`` ). Clique em OK.
Clique em Próximo.
[start=12]
. Na terceira página Configuração do Servidor MySQL (3/3), consulte as opções a seguir:
* *Nome do Serviço Windows*. Especifique um Nome do Serviço Windows para ser usado para a instância do servidor do MySQL.
* *Inicie o MySQL na Inicialização do Sistema*. Deixe a caixa de seleção marcada se for necessário iniciar o servidor MySQL automaticamente no tempo de inicialização do sistema.
* *Executar Serviço do Windows como*. Escolha:
* *Conta Padrão do Sistema*. Recomendada para a maioria dos cenários.
* *Usuário Personalizado*. Uma conta de usuário existente recomendada para cenários avançados.
Clique em Próximo.
[start=13]
. Na página Visão Geral da Configuração, clique em Próximo.
. Quando a configuração do servidor for concluída com sucesso, a mensagem de informações será exibida no painel Concluir. Clique em Finalizar.

*Observação:* para verificar se a instalação foi concluída com êxito, execute o Gerenciador de Tarefas. Se o  ``MySQLd-nt.exe``  estiver na lista de Processos, o servidor de banco de dados está sendo executado.

<<top,início>>

link:/about/contact_form.html?to=3&subject=Feedback:%20Setting%20Up%20the%20MySQL%20Database%20Server%20in%20the%20Windows%20Operating%20System[+Enviar Feedback neste Tutorial+]



== Consulte Também

* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG1790[+Trabalhando e Conectando-se aos Bancos de Dados+] em _Desenvolvendo Aplicações com o NetBeans IDE_
* link:../../trails/php.html[+Trilha de Aprendizado do PHP+]
* link:mysql.html[+Conectando a um Banco de Dados MySQL+]
* link:http://www.mysql.com/why-mysql/java/[+MySQL e Java - Recursos+]
* link:http://dev.mysql.com/doc/refman/5.6/en/index.html[+Manual de Referência do MySQL 5.6+]

<<top,início>>

